加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

容器中的JVM资源该如何被安全的限制?

发布时间:2019-01-28 06:14:08 所属栏目:空间 来源:运维猿
导读:前言 Java与Docker的结合,虽然更好的解决了application的封装问题。但也存在着不兼容,比如Java并不能自动的发现Docker设置的内存限制,CPU限制。 这将导致JVM不能稳定服务业务!容器会杀死你JVM进程,而健康检查又将拉起你的JVM进程,进而导致你监控你的po

openjdk9-openj9 (正确的识别容器限制,3G)安全

  1. [root@xiaoke-test ~]# docker run -m 4GB --rm adoptopenjdk/openjdk9-openj9:alpine-slim java -XshowSettings:vm -version 
  2. VM settings: 
  3.  Max. Heap Size (Estimated): 3.00G 
  4.  Using VM: Eclipse OpenJ9 VM 
  5. openjdk version "9.0.4-adoptopenjdk" 
  6. OpenJDK Runtime Environment (build 9.0.4-adoptopenjdk+12) 
  7. Eclipse OpenJ9 VM (build openj9-0.9.0, JRE 9 Linux amd64-64-Bit Compressed References 20180814_248 (JIT enabled, AOT enabled) 
  8. OpenJ9 - 24e53631 
  9. OMR - fad6bf6e 
  10. JCL - feec4d2ae based on jdk-9.0.4+12) 

openjdk10-openj9 (正确的识别容器限制,3G)安全

  1. [root@xiaoke-test ~]# docker run -m 4GB --rm adoptopenjdk/openjdk10-openj9:alpine-slim java -XshowSettings:vm -version 
  2. VM settings: 
  3.  Max. Heap Size (Estimated): 3.00G 
  4.  Using VM: Eclipse OpenJ9 VM 
  5. openjdk version "10.0.2-adoptopenjdk" 2018-07-17 
  6. OpenJDK Runtime Environment (build 10.0.2-adoptopenjdk+13) 
  7. Eclipse OpenJ9 VM (build openj9-0.9.0, JRE 10 Linux amd64-64-Bit Compressed References 20180813_102 (JIT enabled, AOT enabled) 
  8. OpenJ9 - 24e53631 
  9. OMR - fad6bf6e 
  10. JCL - 7db90eda56 based on jdk-10.0.2+13) 

openjdk11-openj9(正确的识别容器限制,3G)安全

  1. [root@xiaoke-test ~]# docker run -m 4GB --rm adoptopenjdk/openjdk11-openj9:alpine-slim java -XshowSettings:vm -version 
  2. VM settings: 
  3.  Max. Heap Size (Estimated): 3.00G 
  4.  Using VM: Eclipse OpenJ9 VM 
  5. openjdk version "11.0.1" 2018-10-16 
  6. OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.1+13) 
  7. Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.11.0, JRE 11 Linux amd64-64-Bit Compressed References 20181020_70 (JIT enabled, AOT enabled) 
  8. OpenJ9 - 090ff9dc 
  9. OMR - ea548a66 
  10. 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。

  1. MaxRAMFraction取值 堆占比 容器内存=1G 容器内存=2G 容器内存=4G 容器内存=8G 容器内存=16G 
  2. 1 ≈90% 910.50M 1.78G 3.56G 7.11G 14.22G 
  3. 2 ≈50% 455.50M 910.50M 1.78G 3.56G 7.11G 
  4. 3 ≈33% 304.00M 608.00M 1.19G 2.37G 4.74G 
  5. 4 ≈25% 228.00M 455.50M 910.50M 1.78G 3.56G 

OpenJ9

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读