web项目部署后heap溢出(jconsole java虚拟机内存管理 tomcat内存管理)

简介: 阶段性完成编码工作后,打算将项目部署到生产机上看看效果遇到了问题:原本在测试机的eclipse环境能够正常运行的web项目,打包成war文件部署在tomcat上运行后,报错:Java heap space在浏览器上,访问tomcat上部署的web项目时,在浏览器上显示的报错信息。

阶段性完成编码工作后,打算将项目部署到生产机上看看效果遇到了问题:
原本在测试机的eclipse环境能够正常运行的web项目,打包成war文件部署在tomcat上运行后,报错:Java heap space
_
在浏览器上,访问tomcat上部署的web项目时,在浏览器上显示的报错信息。简单的翻译过来就是java的heap溢出。
为什么会heap溢出?
怎么解决这个问题?

原理上说,java语言环境下开发的web项目,运行在tomcat服务器上。
tomcat这个服务器软件,运行在jvm上,而jvm运行在操作系统上,操作系统运行在硬件上。这就是整个的从上到下的关系。

java heap space这种溢出,简单的说就是jvm的heap部分的内存不够用,溢出了。
java虚拟机也就是jvm,的基础知识,是我们这些java工程师需要掌握的基本功:
1-jvm中内存的规划(分几块,各自有什么分工);
2-要知道有GC这样一个概念(内存垃圾处理器),GC管理的是哪块内存;
3-java jdk jre之间是什么关系;
4-jdk自带监控监测工具的使用;

有了上述基本功,以后,我们遇到的问题就可以这样来分析了:
heap溢出的意思是,heap啊,这块内存是线程共享的,存储的是“实例”,那么heap溢出肯定是发生在你的java代码创建“实例”“对象”的时候,也就是运行时(相对于编译时)。
比如下面博客,可以参考一下
http://blog.51cto.com/android/50100
GC管理的就是heap,你的web项目进行第一次实例创建就报错,说明GC应该还没有起作用,我猜测。
java = java语言+java虚拟机+java API包+自己开发的class+第三方jar
jdk = java语言+java虚拟机+java API包
jre = java虚拟机+java API包

java是一个泛泛的概念;
jdk是一个最基础的开发环境;
jre是一个最基础的运行环境;

jdk(是jdk不是jre)自身带有好几个工具和命令,只要你正常安装了jdk并且配置了环境变量path,那么你可以轻松地使用jdk中的命令和工具监控你自己的jvm的运行情况。换句话说,你现在遇到的问题其实是,你自己的jvm上运行的tomcat上部署的web项目heap溢出了,原因是什么?虽然你可以凭借经验或者百度去判断,但是最专业的做法是,看看你自己的生产机上jvm一共分配给heap多少内存,你的web项目使用了多少内存,这样才是最科学的调试方式。其中最应该会用的是Jconsole工具
_
我们来运行一下:
_
上图所示的环境不是开发机也不是生产机,是另一台win7虚拟机,测试用的,很幸运,这台机器安装的tomcat8.0,一上来就可以用,容易上手。
_
很顺利,原因是我们将同样的war文件部署到这台虚拟机上,就正常运行,原因嘛,也很清晰看上图:堆,也就是heap占据的内存始终有600+兆,足够我们的web项目使用,因此肯定是可以运行的。
_
也就是说,同样一个war打包的web项目,在服务器1上运行报错heap溢出,在另一台服务器2上运行,正常。
问题就出在tomcat的配置上。

那么我们去看看这两台服务器上tomcat有什么区别
废柴生产机
_
tomcat自身实际上也有一个监控自己的管理工具
_
_
上图中,看到了废柴生产机上,tomcat使用的jvm的内存情况
下面看看小强生产机的对应情况
_
看看这个tomcat的管理工具
_
看到了吧,这就是差距!
内存大,自然跑的起来。

之前通过小强生产机(win7vm)的jconsole工具看到了,你自己写的web项目跑在tomcat上占据的内存最低也要600+兆,然而废柴生产机一共就300兆左右内存,怎么可能跑的起来呢?

下面我们需要做的工作就很简单了
1-要使用jconsole连接上废柴生产机,随时监控内存使用情况;
2-给废柴生产机分配更多的内存;

参考下面的博客文章配置废柴服务器的tomcat,让它可以被远程连接
http://blog.csdn.net/rainyspring4540/article/details/65434854
首先用tomcat自己的service.bat命令将tomcat9从废柴服务器的服务功能中,卸载;
_
后来我终于发现了问题所在,肯定是之前在配置过程中,不知道哪天手欠,自己修改catalina配置文件的时候把内存值改小了,现在让我改回去,怎么改也不生效。
没办法,我直接把一模一样的tomcat9解压版文件夹整个拷贝来一个全新的,就是修改了一下端口号,其他都不变。
结果,一点问题没有了,废柴服务器不再废柴:
_
虽然目前还没有掌握使用jconsole远程访问服务器上tomcat的方法,也没有掌握tomcat上jvm内存大小修改的方法,但是已经搞明白jvm内存的基础知识,会使用tomcat自身manager和jconsole本地工具查看服务器上tomcat的内存情况,能够用科学的工具应对java heap的OOM了,开森

目录
相关文章
|
9天前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
JVM简介—1.Java内存区域
|
2天前
|
Java 数据库
【YashanDB知识库】kettle同步大表提示java内存溢出
在数据导入导出场景中,使用Kettle进行大表数据同步时出现“ERROR:could not create the java virtual machine!”问题,原因为Java内存溢出。解决方法包括:1) 编辑Spoon.bat增大JVM堆内存至2GB;2) 优化Kettle转换流程,如调整批量大小、精简步骤;3) 合理设置并行线程数(PARALLELISM参数)。此问题影响所有版本,需根据实际需求调整相关参数以避免内存不足。
|
3月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
61 0
|
21天前
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
32 4
|
27天前
|
Java Shell 数据库
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java 内存溢出 【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine! 【问题原因分析】java 内存溢出 【解决/规避方法】 ①增加 JVM 的堆内存大小。编辑 Spoon.bat,增加堆大小到 2GB,如: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms512m" "-Xmx512m" "-XX:MaxPermSize=256m" "-
|
3月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
62 8
|
3月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
3月前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
3月前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
70 0