在性能测试过程中,有时候会发现内存溢出,fullgc等问题,一般都是通过jvm的jmap命令获取堆快照来分析:那些对象大,那些对象多,那些对象影响了性能等;
常见的内存错误有如下三种:
outOfMemoryError 年老代内存不足。
outOfMemoryError:PermGen Space 永久代内存不足。
outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。
下面是获取dump的方法:
第一步:先使用命令查询到java的主进程(pid):
ps -ef|grep java(tomcat)
如果liunx下安装了多个jdk,那么选哟到tomcat服务使用的jdk的bin下执行命令:
/xxx/app/tools/java/jdk1.7.0_21/bin/jmap -heap pid #展示pid的整体堆信息
/xxx/app/tools/java/jdk1.7.0_21/bin/jmap -histo pid #展示class的内存情况
/xxx/app/tools/java/jdk1.7.0_21/bin/jmap -histo:live pid #展示heap中所有对象的情况,
#这个命令执行,jvm先触发gc,然后统计信息,
/xxx/app/tools/java/jdk1.7.0_21/bin/jmap -histo:live pid >m.log #将所有的对象的情况保存在文件中,
#过一段时间再次执行,可以对比到gc回收了那些对象;
/xxx/app/tools/java/jdk1.7.0_21/bin/jmap -dump:live,format=b,file=w.log pid #将内存信息dump到文件中,
#这个命令会将整个heap中所有的信息dump,如果heap较大,那么这个过程特别耗时,一般不用。
在执行这些命令的时候,必须是在压力进行的过程中,如果没有访问,会没有什么结果。