在我们的程序运行过程中,经常会因为各种原因出现OutOfMemoryError的错误,而如何定位是由哪个对象溢出,可通过以下方法进行查看


1、查找JVM运行的任务号

   ps aux |grep ${pid} 或

   jps -m |grep ${pid}

2、运行jmap命令,将java的内存镜像dump到heap.bin文件中

   jmap -dump:live,format=b,file=heap.bin ${pid}

3、运行jhat命令对heap.bin文件进行内存分析(Xmx的参数应该要比监测的heap.bin的heap大一些,才可以进行分析)

   jhat -J-Xmx4g heap.bin

   在执行完成jhat命令后,启动一个http服务,端口为7000,可以通过webUI的方式查看“show heap histogram”。通过此直方图可以看到heap中从高到低的内存对象,及对象的引用等信息。


PS:使用jstack ${pid}可以查看当前任务的运行情况。