V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
karottc
V2EX  ›  Java

JDK17 使用 ZGC 三倍内存问题怎么解决?

  •  
  •   karottc ·
    karottc · 2023-01-16 14:25:19 +08:00 · 2816 次点击
    这是一个创建于 679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT

    目前使用 Java17 ,使用 ZGC ,通过 TOP 命令看到的 Java 进程占用内存会是实际使用内存的三倍。这种情况虽然不影响程序的实际运行,但是对监控运维很有影响,并且由于这种情况,以前一个机器能跑三个 Java 程序的,现在只能跑一个了。

    关于为啥会占用三倍的问题,是由于 ZGC 内存映射实现导致的,可以看下这两个: https://www.zhihu.com/question/356585590/answer/1654398037

    https://stackoverflow.com/questions/57899020/zgc-max-heap-size-exceed-physical-memory

    ZGC 的官方说明是 8M -> 16T 的堆都可以使用 ZGC

    Handle heaps ranging from a 8MB to 16TB in size

    https://wiki.openjdk.org/display/zgc/Main

    这本范围说明,基本任何情况都可以使用 ZGC ,并不存在只有大堆使用。

    但是如果内存三倍问题不解决的话,还是没法用的。

    这个问题,大家有什么解决办法?

    12 条回复    2023-06-17 09:28:47 +08:00
    cubecube
        1
    cubecube  
       2023-01-16 14:28:11 +08:00
    RSS 也不影响啥
    julyclyde
        2
    julyclyde  
       2023-01-16 14:28:19 +08:00
    监控指标选的 VSS ?是不是应该选 RSS ?
    hyperdak288
        3
    hyperdak288  
       2023-01-16 14:30:23 +08:00
    看完你给的资料,里面有人提到的点是 3 倍内存是虚拟内存,其实不影响真正的内存?
    dqzcwxb
        4
    dqzcwxb  
       2023-01-16 14:31:58 +08:00
    这是之前类似的帖子:https://www.v2ex.com/t/868984
    目前我也没找到更好的方案,如果无法忍受这个问题那就换成 G1 或者 Shenandoah 吧
    karottc
        5
    karottc  
    OP
       2023-01-16 14:33:24 +08:00
    @cubecube @julyclyde @hyperdak288

    虚拟内存三倍,物理内存还是实际的,跑起来实际不影响,但是影响 ECS 的监控,会报警,而且 TOP 命令看进程的时候,%mem 占用也是三倍,不是实际的。
    c0t
        6
    c0t  
       2023-01-16 14:34:44 +08:00 via iPhone
    虚拟内存有关系吗….我司的自有游戏引擎经常占用 1T 的虚拟空间地址,用于 ecs 系统
    karottc
        7
    karottc  
    OP
       2023-01-16 14:35:20 +08:00
    @dqzcwxb 嗯。 我也看到这个帖子,但是这个讲的是 IDEA ,桌面端用啥感觉影响不大。

    我也在考虑要不要用回 G1
    hyperdak288
        8
    hyperdak288  
       2023-01-16 14:39:08 +08:00   ❤️ 1
    可以试试 shenandoah.

    https://learn.microsoft.com/en-us/azure/developer/java/containers/overview 这里有 azure 给的建议

    ZGC <1 ms, shenandoah <10ms ,jdk11 即可用,有部分发行版带 shenandoah.
    hyperdak288
        9
    hyperdak288  
       2023-01-16 14:42:33 +08:00
    可观测性拿到的都是三倍,这样就是可观测性方面的错误啊- -
    后续有相关的修正才能方便用一些,可观测性那边针对这个 case 来 fix 的成本太高了
    julyclyde
        10
    julyclyde  
       2023-01-16 15:22:47 +08:00
    @karottc %mem 这个是后来计算出来的结果啊。如果你选的原始值就不对,除出来自然也不对
    dqzcwxb
        11
    dqzcwxb  
       2023-06-12 17:11:00 +08:00
    好消息来了
    https://openjdk.org/jeps/439 jdk21 zgc 将使用分代策略并取消多重映射
    Generational ZGC from non-generational ZGC, and from other garbage collectors:
    No multi-mapped memory
    Optimized barriers
    Double-buffered remembered sets
    Relocations without additional heap memory
    Dense heap regions
    Large objects
    Full garbage collections
    karottc
        12
    karottc  
    OP
       2023-06-17 09:28:47 +08:00 via iPhone
    @dqzcwxb 等出来了测试下效果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 21:00 · PVG 05:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.