如果观察一个系统,每次进行 FullGC 发现堆空间回收的比例比较小,尤其是老年代,同时对象越来越多,这个时候可 以判断是有可能发生内存泄漏.
如何排查:

  1. 使用jps查看虚拟机进程;
  2. 使用jstat -gcutil [pid] [interval]命令查看gc回收情况;
  3. 使用轻量级在线分析工具 jmap-histo:live [pid] 查看和定位信息;
  4. 若无法定位则使用 jmap -dump:live,format=b,file=heap.hprof [pid] 生成转储快照使用MAT等工具进行离线分析,定位问题。

优化思路

  1. 定位问题后进行程序优化,效果通常非常大;
  2. 扩容,给JVM分配更大的内存;
  3. 参数调优,在成本、吞吐量、延迟之间找一个平衡点。