V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shanghai1943
V2EX  ›  问与答

请教 JVM GC 问题

  •  
  •   shanghai1943 · 2021-11-30 14:54:51 +08:00 · 951 次点击
    这是一个创建于 868 天前的主题,其中的信息可能已经有所发展或是发生改变。
    机器内存: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 的内存饼图,这是啥原因?感谢。
    8 条回复    2021-11-30 17:48:31 +08:00
    cubecube
        1
    cubecube  
       2021-11-30 16:09:06 +08:00   ❤️ 1
    old gen 这么大的原因是没有达到回收的临界点么?
    ---对
    hand515
        2
    hand515  
       2021-11-30 16:24:50 +08:00 via Android   ❤️ 1
    4g 的 90%也就 3.6g
    你的 jvm 分配堆加 metaspace 都 3.2g 了
    而且你的年轻代才分 64m ,老年代肯定很多垃圾

    你这内存参数不太合理
    shanghai1943
        3
    shanghai1943  
    OP
       2021-11-30 16:28:52 +08:00
    @hand515 了解。感谢回复。打算调高年轻代的大小到 128m 或者 256m 。也在考虑要不要转到 G1GC 上。
    JDog
        4
    JDog  
       2021-11-30 16:34:55 +08:00
    大胆一点,不要设置内存参数
    hand515
        5
    hand515  
       2021-11-30 16:38:07 +08:00 via Android
    128m 也太小气了,如果你的对象大多是生命周期不是很长的,可以适当再大点,能在 younggc 时就回收了,当然,太大了 ygc 的耗时也会大点,自己测试下找个平衡吧
    shanghai1943
        6
    shanghai1943  
    OP
       2021-11-30 16:41:35 +08:00
    @hand515 嗯嗯好的。感谢指点。
    shanghai1943
        7
    shanghai1943  
    OP
       2021-11-30 16:41:49 +08:00
    @JDog 啊这。。太奔放了吧。。
    dqzcwxb
        8
    dqzcwxb  
       2021-11-30 17:48:31 +08:00   ❤️ 2
    换 G1 保平安
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1077 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:54 · PVG 02:54 · LAX 11:54 · JFK 14:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.