08 导出频繁FullGC如何定位泄漏点,你是如何优化的

vvEcho 2025-02-19 18:36:37
Categories: > Tags:

假设导出百万级数据到Excel时出现频繁Full GC,如何定位内存泄漏点?如果发现是POI的SXSSFWorkbook未正确释放资源,除了调用dispose(),还有哪些优化手段?请结合JVM参数调优和代码规范说明

可通过JVisualVM 分析工具,分析堆栈内存

1
2
3
4
5
6
7
# 启动参数添加GC日志和堆转储
java -Xmx4g -Xms4g \
-XX:+UseG1GC \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/path/to/dump.hprof \
-jar data-export.jar

打开dump.hprof,查看Dominator Tree,找到占用内存最大的对象。
若发现大量SXSSFWorkbook或Row/Cell对象未被回收,说明存在资源未释放

1
2
[Full GC (Allocation Failure) ...
[PSOldGen: 3670016K->3670016K/3670016K] ...

现象:老年代内存几乎无回收,表明存在长期存活的大对象

除了dispose()外,需结合以下措施: