GC 日志:
1 | 2022-01-17T13:39:14.399+0800: 920001.780: [GC pause (G1 Evacuation Pause) (young), 0.0109317 secs] |
堆内内存使用突然增加,且 FullGC 后释放不多,如 GC 日志中 [Full GC (Allocation Failure) 2037M->1195M(2048M), 3.2218960 secs]
所描述,FullGC 后堆内内存为 1195MB,远大于平时 680MiB 的内存占用,持续一分钟后才恢复。今天先在线上这台实例启用 HeapDumpAfterFullGC
选项,以便线上复现该问题时能够自动发起堆转储,看看内存中具体是什么以及哪些线程在执行。
2022-02-18
今天探测到了该问题,由 Excel 解析导致,单个线程占用的 Retained Heap 为 972954224 字节,即 927MB,关键栈帧如下:
1 | http-nio-80-exec-78 |
GC 日志如下:
1 | 2022-02-18T14:50:12.856+0800: 2503126.257: [GC pause (G1 Evacuation Pause) (young) (to-space exhausted), 1.7350175 secs] |
通知业务方将 POI 更换为 GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具 以解决该问题。
2022-09-05
最近使用该标记定位了类似的问题,代码执行过程中对比较大的对象进行了 JSON 序列化,单次调用内存占用数百兆,导致不定期的 FullGC,通知业务方优化相关数据后解决该问题。
Reference
Full GC analysis: Set Java VM parameters to automatically generate Dump before and after Full GC
Capturing heap dumps before FullGCs to troubleshoot memory problems | Jira | Atlassian Documentation
Universal JVM GC analyzer - Java Garbage collection log analysis made easy
jdk/collectedHeap.cpp at jdk8-b120 · openjdk/jdk · GitHub
jdk/heapDumper.cpp at jdk8-b120 · openjdk/jdk · GitHub
Shallow vs. Retained Heap