机器内存:4GB
JVM 信息:jdk1.8 ,默认的垃圾回收策略 -XX:+UseParallelGC
启动参数:-Xms3072M -Xmx3072M -Xmn64M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError
前几天在某云平台收到了内存告警的短信,阈值是内存使用量超过 90%后触发。
登录到 ECS 机器上,使用 jmap -heap PID 命令查看,得到如下输出
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 3221225472 (3072.0MB)
NewSize = 67108864 (64.0MB)
MaxNewSize = 67108864 (64.0MB)
OldSize = 3154116608 (3008.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 268435456 (256.0MB)
CompressedClassSpaceSize = 260046848 (248.0MB)
MaxMetaspaceSize = 268435456 (256.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 57671680 (55.0MB)
used = 52005488 (49.59629821777344MB)
free = 5666192 (5.4037017822265625MB)
90.17508766867898% used
From Space:
capacity = 4718592 (4.5MB)
used = 98304 (0.09375MB)
free = 4620288 (4.40625MB)
2.0833333333333335% used
To Space:
capacity = 4718592 (4.5MB)
used = 0 (0.0MB)
free = 4718592 (4.5MB)
0.0% used
PS Old Generation
capacity = 3154116608 (3008.0MB)
used = 2557243672 (2438.7776107788086MB)
free = 596872936 (569.2223892211914MB)
81.07638333706146% used
从输出的信息上看,old gen 的使用量达到了 81%,应该是老年代一直没回收的原因导致的告警。
随后用 jmap 命令 dump 了一个堆栈信息到本地,大概有 3.24GB ,用 mat 工具查看,发现大对象加起来只有 99MB 而已
如图
https://imgtu.com/i/o1VSlq 想请问下,old gen 这么大的原因是没有达到回收的临界点么? dump 后的文件大小有 3GB ,但是用内存分析工具打开后就只有不到 100MB 的内存饼图,这是啥原因?感谢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/819035
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.