jvm

这个问题跟jvm是哪个厂商的有关,我们遇到比较多的应该是两类:

sun:

用jmap命令(pid代表java进程号)dump出来,然后用eclipsememoryanalyzer(这个网上可以下载到)可以打开:

jmap-dump:live,format=b,file=/tmp/dump.binpid

上面的方式可以看到瞬间的内存快照,引用关系。一般特别明显的内存不释放可以看出来。

其实还有另一种方式,直接在服务器上运行jmap-histo:livepid,运行多次,看哪个对象的数量是一直涨不减应该就有问题。如果代码看不出问题,可以结合上面的方式来定位是哪个引用没有释放。

ibm:

因为这边是用的sunjvm,以前服务器我们基本比较少接触,我记得以前他们是用kill-3命令来让jvmdump出内存,然后用IBMDumpAnalyzer(这个公司应该有,好像是有分版本)来分析,具体方法可以是单次dump找出那种不应该存在这么多数量的对象,如果不好找的话,也可以隔几秒钟再dump一次,两次来进行对比,哪些对象是一直增加不减少的,这种对象就是比较值得怀疑的对象。

相关推荐