分析Docker容器Jvm 堆栈GC信息
# 打印jvm启动参数
docker exec -ti <容器名> jcmd 1 VM.flags-XX:CICompilerCount=3 -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=2147483648 -XX:MaxMetaspaceSize=157286400 -XX:MaxNewSize=715653120 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=357564416 -XX:OldSize=716177408 -XX:ThreadStackSize=512 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC-XX:InitialHeapSize 1GB (1073741824) JVM 启动时初始堆大小
-XX:MaxHeapSize 2GB (2147483648) 堆内存最大限制(已占满容器 2GB 内存的 100%,风险极高!)
-XX:MaxMetaspaceSize 150MB (157286400) 元空间(Metaspace)上限
-XX:MaxNewSize ~682MB (715653120) 年轻代(Young Gen)最大值
-XX:+UseParallelGC 启用 使用 Parallel Scavenge 垃圾回收器(适合吞吐量优先场景)# 打印GC信息
docker exec -it <容器名> jstat -gc 1 1s# 输出堆栈信息
docker exec -ti <容器名> jmap -dump:live,format=b,file=/heap.hprof 1
docker cp <容器名>:/heap.hprof .# 手动执行gc
docker exec -ti <容器名> jcmd 1 GC.run# 打印GC信息
docker exec -it <容器名> jstat -gc 1 1s
# 堆栈是否正常
docker exec -it <容器名> jstat -gcutil 1 1s# 使用scp将堆栈信息下载到本地 或者 其他工具可以直接拖拽
下载 eclipse mat
https://mirrors.bfsu.edu.cn/eclipse/mat/
我下载的是 https://mirrors.bfsu.edu.cn/eclipse/mat/1.16.0/rcp/ jdk最低版本为17 在下载完成后解压,修改配置文件
打开 MemoryAnalyzer.ini 在 -vmargs 上面新增
-vm
D:/Program Files/Java/jdk-17.0.14/bin/javaw.exe整体内容如下-startup
plugins/org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.1100.v20240722-2106
-vm
D:/Program Files/Java/jdk-17.0.14/bin/javaw.exe
-vmargs
--add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
-Xmx1024m
双击运行 MemoryAnalyzer.exe,导入下载好的 heap.hprof
查看内存占用信息
点击泄漏报告,会自动生成对应的报告,可以具体到某行代码,分析内存占用居高的问题