【对于正常运行的系统】
- 使用jmap来查看JVM中各个区域的使用情况。
- 使用jstack来查看线程的运行情况,比如:哪些线程阻塞、是否出现了死锁。
- 使用jstat命令来查看垃圾回收情况,特别是fullGC,如果fullGC比较频繁,那么就得进行调优了
- 初步猜测频繁发生fullGC的原因。如果频发发生fullGC但是却一直没有出现内存溢出,那么表示fullGC实际上是回收了很多对象了,所以这些对象最好能在youngGC里就直接回收掉,避免这些对象进入老年代。对于这种情况,就要考虑这些存活时间不长的对象是不是比较大,导致年轻代放不下而直接进入了老年代。那么我们尝试加大年轻大的大小,如果改完后,fullGC减少了,则表明修改是有效果的。
- 通过jConsole、VisualVM等工具来进行分析
【对于已经发生了OOM的系统】
- 一般生产系统中都会设置当系统发生了OOM时,生成当时的dump文件 -XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base
- 我们可以通过jConsole、VisualVM等工具来进行分析
- 根据dump文件找到异常的实例对象和异常的线程(占用CPU高),定位到具体的代码,然后再进行详细的分析和调试