问题现象
- Java程序报错
java.lang.OutOfMemoryError: Java heap space
- Java进程内存使用率高;
- JVM堆内存使用率高,尤其是老年代;
- FGC频繁;
问题原因
- 动态分配的堆内存持续递增不释放;(长生命周期对象持有短生命周期对象导致GC无法回收),例如 ThreadLocal 忘记 remove;
- 数据库/网络Socket/IO的连接打开后忘记关闭;
排查思路
top -Hp <pid>
命令(可选用 htop 命令):查看进程的内存使用率是否持续居高不下;jstack <pid> | grep -A 10 <tid_hex>
命令(可选用 show-busy-java-threads 工具):查看线程状态,排除死锁和IO阻塞;jstat -gcutil <pid> <interval>
命令:查看进程是否频繁发生FGC;jmap -heap <pid>
命令:查