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 ,并不存在只有大堆使用。
但是如果内存三倍问题不解决的话,还是没法用的。
这个问题,大家有什么解决办法?
1
cubecube 2023-01-16 14:28:11 +08:00
RSS 也不影响啥
|
2
julyclyde 2023-01-16 14:28:19 +08:00
监控指标选的 VSS ?是不是应该选 RSS ?
|
3
hyperdak288 2023-01-16 14:30:23 +08:00
看完你给的资料,里面有人提到的点是 3 倍内存是虚拟内存,其实不影响真正的内存?
|
4
dqzcwxb 2023-01-16 14:31:58 +08:00
这是之前类似的帖子:https://www.v2ex.com/t/868984
目前我也没找到更好的方案,如果无法忍受这个问题那就换成 G1 或者 Shenandoah 吧 |
5
karottc OP @cubecube @julyclyde @hyperdak288
虚拟内存三倍,物理内存还是实际的,跑起来实际不影响,但是影响 ECS 的监控,会报警,而且 TOP 命令看进程的时候,%mem 占用也是三倍,不是实际的。 |
6
c0t 2023-01-16 14:34:44 +08:00 via iPhone
虚拟内存有关系吗….我司的自有游戏引擎经常占用 1T 的虚拟空间地址,用于 ecs 系统
|
7
karottc OP |
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. |
9
hyperdak288 2023-01-16 14:42:33 +08:00
可观测性拿到的都是三倍,这样就是可观测性方面的错误啊- -
后续有相关的修正才能方便用一些,可观测性那边针对这个 case 来 fix 的成本太高了 |
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 |