openjdk9-openj9 (正确的识别容器限制,3G)安全
- [root@xiaoke-test ~]# docker run -m 4GB --rm adoptopenjdk/openjdk9-openj9:alpine-slim java -XshowSettings:vm -version
- VM settings:
- Max. Heap Size (Estimated): 3.00G
- Using VM: Eclipse OpenJ9 VM
- openjdk version "9.0.4-adoptopenjdk"
- OpenJDK Runtime Environment (build 9.0.4-adoptopenjdk+12)
- Eclipse OpenJ9 VM (build openj9-0.9.0, JRE 9 Linux amd64-64-Bit Compressed References 20180814_248 (JIT enabled, AOT enabled)
- OpenJ9 - 24e53631
- OMR - fad6bf6e
- JCL - feec4d2ae based on jdk-9.0.4+12)
openjdk10-openj9 (正确的识别容器限制,3G)安全
- [root@xiaoke-test ~]# docker run -m 4GB --rm adoptopenjdk/openjdk10-openj9:alpine-slim java -XshowSettings:vm -version
- VM settings:
- Max. Heap Size (Estimated): 3.00G
- Using VM: Eclipse OpenJ9 VM
- openjdk version "10.0.2-adoptopenjdk" 2018-07-17
- OpenJDK Runtime Environment (build 10.0.2-adoptopenjdk+13)
- Eclipse OpenJ9 VM (build openj9-0.9.0, JRE 10 Linux amd64-64-Bit Compressed References 20180813_102 (JIT enabled, AOT enabled)
- OpenJ9 - 24e53631
- OMR - fad6bf6e
- JCL - 7db90eda56 based on jdk-10.0.2+13)
openjdk11-openj9(正确的识别容器限制,3G)安全
- [root@xiaoke-test ~]# docker run -m 4GB --rm adoptopenjdk/openjdk11-openj9:alpine-slim java -XshowSettings:vm -version
- VM settings:
- Max. Heap Size (Estimated): 3.00G
- Using VM: Eclipse OpenJ9 VM
- openjdk version "11.0.1" 2018-10-16
- OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.1+13)
- Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.11.0, JRE 11 Linux amd64-64-Bit Compressed References 20181020_70 (JIT enabled, AOT enabled)
- OpenJ9 - 090ff9dc
- OMR - ea548a66
- JCL - f62696f378 based on jdk-11.0.1+13)
分析
分析之前我们先了解这么一个情况:
JavaMemory (MaxRAM) = 元数据+线程+代码缓存+OffHeap+Heap...
一般我们都只配置Heap即使用-Xmx来指定JVM可使用的最大堆。而JVM默认会使用它获取到的最大内存的1/4作为堆的原因也是如此。
安全性(即不会超过容器限制被容器kill)
OpenJdk
OpenJdk8-12,都能保证这个安全性的特点(8和9需要特殊参数,-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap)。
OpenJ9
2.IbmOpenJ9所有的版本都能识别到容器限制。
资源利用率
OpenJdk
自动识别到容器限制后,OpenJdk把最大堆设置为了大概容器内存的1/4,对内存的浪费不可谓不大。
当然可以配合另一个JVM参数来配置最大堆。-XX:MaxRAMFraction=int。下面是我整理的一个常见内存设置的表格, 从中我们可以看到似乎JVM默认的最大堆的取值为MaxRAMFraction=4,随着内存的增加,堆的闲置空间越来越大,在16G容器内存时,java堆只有不到4G。
- MaxRAMFraction取值 堆占比 容器内存=1G 容器内存=2G 容器内存=4G 容器内存=8G 容器内存=16G
- 1 ≈90% 910.50M 1.78G 3.56G 7.11G 14.22G
- 2 ≈50% 455.50M 910.50M 1.78G 3.56G 7.11G
- 3 ≈33% 304.00M 608.00M 1.19G 2.37G 4.74G
- 4 ≈25% 228.00M 455.50M 910.50M 1.78G 3.56G
OpenJ9 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|