2016年9月16日 每周一篇博客
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。
解决这类问题有两种思路:
1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。
2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1
024m
以上2钟思路我尝试过其中第二种设置了Xms后还是会溢出
所以只能退而寻求第一种解决方案,但是因为第一种解决方案一个项目涉及到的代码量较多不同人开发不同模块,所以就需要引入了一个内存监控---------IBM HeapAnalyzer
首先在在tomcat的catalina.sh文件中添加
JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/tom/Tomcat7/
tomcat指定hprof文件路径
启动tomcat时 启用tomcat命令
./startup.sh -XX:+HeapDumpOnOutOfMemoryError
如果出现内存溢出,将会在/home/tom/Tomcat7/ 路径下生成一个hprof文件。
查看hprof使用IBM HeapAnalyzer
运行java -Xmx512m -jar ha456.jar,文件过大使用java -Xmx1024m -jar ha456.jar在启动的程序中打开hprof文件
检查发现如下图:
表示我这个业务类占用的内存较多,所以需要修改这个业务内,将其放到缓存里而不是Map里。具体的该工具使用请自己查询,这边不多说。
附该工具的下载链接:http://download.csdn.net/detail/whatsyournamejack/9631363