内存飙高问题怎么排查?

内存占用过高通常发生在Java进程中,主要原因是创建了大量对象,导致垃圾回收无法及时跟上对象创建的速度,或者存在内存泄漏导致对象无法被回收。

以下是问题分析的步骤:

1)观察垃圾回收情况。

  • 使用jstat -gc <进程ID> 1000命令查看GC次数、时间等信息,每秒打印一次。
  • 使用jmap -histo <进程ID> | head -20命令查看占用堆内存空间最多的前20个对象类型,初步确定哪个对象占用了大量内存。

如果每次GC次数频繁,而且每次回收的内存空间较大,说明内存占用高是因为对象创建速度过快;如果每次回收的内存空间很少,很可能存在内存泄漏导致内存无法回收。

2)导出堆内存文件快照。

  • 使用jmap -dump:live,format=b,file=/home/myheapdump.hprof <进程ID>命令将堆内存信息导出到文件。

3)使用VisualVM等工具对导出的堆内存文件进行离线分析,找出占用内存较高的对象,进一步确定创建该对象的业务代码位置,通过代码和业务场景来定位具体问题。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题