前几天看见一篇文章关于我们的jvm报的OutOfMemoryError错误,今天我们来看看这个错误,以及介绍一个插件来诊断产生这个问题的具体漏洞在哪里
OutOfMemoryError错误常见的错误提示:
- tomcat:java.lang.OutOfMemoryError: PermGen space
- tomcat:java.lang.OutOfMemoryError: Java heap space
- weblogic:Root cause of ServletException java.lang.OutOfMemoryError
- resin:java.lang.OutOfMemoryError
- java:java.lang.OutOfMemoryError
遇到这种问题,大部分人去百度,网上就是增加堆的大小,具体有如下几个方法增加:
1、通过myeclipse工具,如图
2、没有myeclipse工具直接通过tomcat服务器
一、手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.bat(windows系统)或者catalina.sh(unix系统)在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m
这里要注意一点,如果通过myeclipse启动的,那么在第二种设置时是没有用的,相反也一样。
还有一点之前有些网址说在eclipse.ini中加,配置eclipse.ini只是配置了eclipse运行时的jvm堆内存(eclispe是一个java程序)。
以上就是一些办法,但我们今天就为了分析这个问题具体在哪些代码产生的,今天来一个分析的工具,以及一些jvm脚本
-
-Xloggc:gc.log
- 在每次垃圾收集时打印堆内存以及垃圾收集的信息
-
-XX:+PrintGCDetails
- 打印更多的关于垃圾收集的信息。
-
-XX:+PrintGCTimeStamps
- 打印从HotSpot 虚拟机开始执行直至垃圾收集事件发生所花费的时间(以秒为单位)
-
-XX:+HeapDumpOnOutOfMemoryError
-
-
系统会生成堆内存转储文件
-
上面几个脚本的意思也有说明,之后就是加上这些脚本。加的方式也有两种
第一种:运行application 如图
按run,之后刷新项目,这时候发现多了两个文件,如图
第一个文件是gc垃圾回收的日志文件,第二个是出现堆错误的时候出现的
第二种:web 项目
web项目的设置我就不讲了,本文章一开始就讲过了,也有两种方式。
上诉的操作之前先安装一个插件,叫 Eclise内存分析器(Eclipse Memory Analyzer)
具体怎么安装看网上资料,我这里不多提了,安装成功的如图
这个有什么用呢,主要去看之前我们生产的.hprof文件,用这个工具去分析。安装成功这个插件后,直接双击.hprof文件,如图显示
上图可以看出具体出现OutOfMemoryError的原因了。具体这个插件怎么用,大家也可以去网上查,我只是用了其中很小的一部分
参考网址