UseContainerSupport
-
使用支持容器感知的 JVM 版本:
-
JDK 8u191+、JDK 10+ 默认支持容器 CPU 和内存感知;
-
通过参数
-XX:+UseContainerSupport启用(JDK 10+ 默认启用)。
-
-
手动指定处理器数量:
-
使用 JVM 参数:
-XX:ActiveProcessorCount=N明确告诉 JVM 可用的 CPU 核数 。
-
-
验证 JVM 实际识别的核数:
-
启动时添加参数:
-XshowSettings:system查看输出中的CPU: totalProcessorCount值 。 -
那么,出现此问题的根源是什么?
1、对于 JVM 而言,如果没有设置 Heap Size,就会按照宿主机环境的内存大小缺省设置自己的最大堆大小。
2、Docker 容器利用 CGroup 对进程使用的资源进行限制,而在容器中的 JVM 依然会利用宿主机环境的内存大小和 CPU 核数进行缺省设置,这导致了 JVM Heap 的错误计算。
同样,类似,JVM 缺省的 GC、JIT 编译线程数量取决于宿主机 CPU 核数。如果我们在一个节点上运行多个 Java 应用,即使我们设置了 CPU 的限制,应用之间依然有可能因为 GC 线程抢占切换,导致应用性能受到影响。
- -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
-
时来天地皆同力,运去英雄不自由
浙公网安备 33010602011771号