JAVA程序内存溢出问题原因分析
本文较为详细的分析了JAVA程序内存溢出问题原因。分享给大家供大家参考。具体如下: 遇到一个线上系统报 java.lang.OutOfMemoryError: PermGen space 错误,需要定位一下问题。很久之前到时弄过这个,现在还真有点不记得了,但这个真的是一个非常有意思的问题,值得好好研究一下。首先第一反应当然是加上-XX:+PrintGCDetails参数来看具体的GC日志,但是由于程序是tomcat启动的,担心里面封装的东西太多不好定位,既然在windows下面,所以还是借助可视化工具好了。 linux下在catalina.sh文件的开头加上: 复制代码 代码如下: JAVA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m"
windows下在catalina.bat的文件开头加上: 复制代码 代码如下: set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=256m
接着我们还是用可视化的内存查看工具来定位一下具体的问题。对于jdk6首选当然是自带的工具啦,比较常用的有jconsole和jvisualvm(使用后发现后者更强大,因为有丰富的插件支持)。这次又遇到一个比较诡异的问题,就是分析工具打开后居然找不到tomcat进程(事后发现居然启动的是jre,改成jdk应该就可以了)。 既然本地不让连,我就远程连接得了,打开JMX即可。 复制代码 代码如下: -Djava.rmi.server.hostname=192.168.1.101 -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
启动程序以后用netstat查看一下端口是否正确打开,以确保远程可以连接上。 等连上程序以后,观察一段时间的内存变化状况,我重点看了下Perm的情况,一直稳定在94m的样子,运行一天一切正常。可能是之前设置Perm内存大小没有生效,因为Perm默认初始化是16m,最大是64m,而实际占用量确实有可能导致这个问题,从目前的现象来看应该是不会再出现这个问题了。如果需要更进一步定位问题,还可以使用btrace去查看某个方法具体被调用的地方。这样可以定位到某些方法是否按预期执行。 希望本文所述对大家的java程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |