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了,开森

目录
相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
40 2
|
1月前
|
存储 算法 安全
【JVM】深入理解JVM对象内存分配方式
【JVM】深入理解JVM对象内存分配方式
29 0
|
1月前
|
Java 程序员
探讨JVM垃圾回收机制与内存泄漏
探讨JVM垃圾回收机制与内存泄漏
|
2月前
|
存储 缓存 算法
深入剖析Java中JVM的内存模型!!!
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
49 1
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
36 0
|
28天前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
37 1
|
27天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
79 0
|
14天前
|
存储 前端开发 安全
JVM内部世界(内存划分,类加载,垃圾回收)(上)
JVM内部世界(内存划分,类加载,垃圾回收)
48 0
|
18天前
|
存储 算法 安全
深度解析JVM世界:JVM内存分配
深度解析JVM世界:JVM内存分配
|
1月前
|
存储 缓存 安全
[Java基础]——JVM内存模型
[Java基础]——JVM内存模型