JAVA程序内存溢出问题原因分析

 更新时间:2024年09月02日 16:53:39   作者:liuzx32  
这篇文章主要介绍了JAVA程序内存溢出问题原因,较为详细的分析java导致程序内存溢出的原因与解决方法,需要的朋友可以参考下

本文较为详细的分析了JAVA程序内存溢出问题原因。分享给大家供大家参考。具体如下:

遇到一个线上系统报 java.lang.OutOfMemoryError: PermGen space 错误,需要定位一下问题。很久之前到时弄过这个,现在还真有点不记得了,但这个真的是一个非常有意思的问题,值得好好研究一下。首先第一反应当然是加上-XX:+PrintGCDetails参数来看具体的GC日志,但是由于程序是tomcat启动的,担心里面封装的东西太多不好定位,既然在windows下面,所以还是借助可视化工具好了。
然后我们来看一下这个错误的产生原因,在网上找到一段解释,说的很不错,贴过来借用一下:)
 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
那么我们先加大PermGen的初始内存大小:

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即可。
和上面一样,在catalina.sh或catalina.bat文件的开头的JAVA_OPTS里面加上

复制代码 代码如下:
-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查看一下端口是否正确打开,以确保远程可以连接上。
我这里偷懒了下,把authenticate关掉了,要是打开需要设置一些权限的东西,比较麻烦。这个设置在我本地的PC机上生效,但是在服务器上居然不行,可能装了什么软件把端口给封了,所以我只好把端口改成1000。打开jvisualvm,点击file -> add JMX connection,然后加上localhost:1000就连上了。

等连上程序以后,观察一段时间的内存变化状况,我重点看了下Perm的情况,一直稳定在94m的样子,运行一天一切正常。可能是之前设置Perm内存大小没有生效,因为Perm默认初始化是16m,最大是64m,而实际占用量确实有可能导致这个问题,从目前的现象来看应该是不会再出现这个问题了。如果需要更进一步定位问题,还可以使用btrace去查看某个方法具体被调用的地方。这样可以定位到某些方法是否按预期执行。

希望本文所述对大家的java程序设计有所帮助。

相关文章

  • java实现简单的扫雷小游戏

    java实现简单的扫雷小游戏

    这篇文章主要为大家详细介绍了java实现简单的扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • springBoot项目如何实现启动多个实例

    springBoot项目如何实现启动多个实例

    这篇文章主要介绍了springBoot项目如何实现启动多个实例的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SSM使用mybatis分页插件pagehepler实现分页示例

    SSM使用mybatis分页插件pagehepler实现分页示例

    本篇文章主要介绍了SSM使用mybatis分页插件pagehepler实现分页示例,使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,非常具有实用价值,需要的朋友可以参考下
    2018-03-03
  • Java原生序列化和反序列化代码实例

    Java原生序列化和反序列化代码实例

    这篇文章主要介绍了Java原生序列化和反序列化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 代码分析Java中线程的等待与唤醒

    代码分析Java中线程的等待与唤醒

    本篇文章给大家分享了关于Java中线程的等待与唤醒的知识点内容,有需要的朋友们可以学习下。
    2018-10-10
  • SpringBoot与单元测试JUnit的结合操作

    SpringBoot与单元测试JUnit的结合操作

    这篇文章主要介绍了SpringBoot与单元测试JUnit的结合操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 浅谈Maven resrouce下filtering作用

    浅谈Maven resrouce下filtering作用

    Filtering是Maven Resources Plugin的一个功能,本文主要介绍了浅谈Maven resrouce下filtering作用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 通过实例学习JAVA对象转成XML输出

    通过实例学习JAVA对象转成XML输出

    这篇文章主要介绍了通过实例学习JAVA对象转成XML输出,做流程图的项目时,新的流程定义为xml的,需要对xml与java对象进行互转,下面我们来深入学习,需要的朋友可以参考下
    2019-06-06
  • Java一个简单的红包生成算法

    Java一个简单的红包生成算法

    今天小编就为大家分享一篇关于Java一个简单的红包生成算法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 连续调用多个外部系统写接口保证数据一致性的思路

    连续调用多个外部系统写接口保证数据一致性的思路

    今天小编就为大家分享一篇关于连续调用多个外部系统写接口保证数据一致性的思路,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论