cgroup 支持
从 jdk 8u121 开始支持,即低于这个版本无法使用容器特性
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8170888
https://bugs.openjdk.org/browse/JDK-8170888
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8175898
https://bugs.openjdk.org/browse/JDK-8140793
从 jdk 8u131 开始支持 docker 的内存和cpu限制
https://blogs.oracle.com/java/post/java-se-support-for-docker-cpu-and-memory-limits
启用方式
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
支持内存自适应
在 jdk 8u191 中加入 UseContainerSupport 和 ActiveProcessorCount 参数,因为 jdk 8 使用最广泛
https://www.oracle.com/java/technologies/javase/8u191-relnotes.html
https://jvm-argument-for-docker.teaho.net/
其中,-XX:InitialRAMFraction、-XX:MaxRAMFraction、-XX:MinRAMFraction 标记为过期,对应的替换参数将 Fraction 替换为 Percentage,即 -XX:InitialRAMPercentage、 -XX:MaxRAMPercentage、-XX:MinRAMPercentage。
替换前 | InitialRAMFraction | MaxRAMFraction | MinRAMFraction |
替换后 | InitialRAMPercentage | MaxRAMPercentage | MinRAMPercentage |
需要手动添加 -XX:+UseContainerSupport,来进行内存自适应。
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8146115
https://bugs.openjdk.org/browse/JDK-8146115
指定使用 cpu 数量
-XX:ActiveProcessorCount=xx
从 jdk 10 开始默认支持容器化部署
java
总结
jdk 版本 < 8u121,不要在容器化环境中使用
8u131 <= jdk 版本 < 8u191,添加参数 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap 支持内存自适应。
8u191 <= jdk 版本 < jdk 10,添加了参数 -XX:+UseContainerSupport 支持内存自适应,-XX:ActiveProcessorCount 支持调整 cpu 数量。
jdk 10 <= jdk 版本,-XX:+UseContainerSupport 默认启用。
UseContainerSupport 参数只在 linux x64 系统上使用。
按照文章的讲解
https://zhuanlan.zhihu.com/p/602433997
上面的情况都是在 cgroup v1的情况下,如果在 cgroup v2下就会有问题了。
https://bugs.openjdk.org/browse/JDK-8230305
从 jdk 11.0.6 和 jdk 8u372 开始支持 cgroup v2。
参考链接
https://blog.csdn.net/lyy12332133/article/details/131311033
https://www.cnblogs.com/xiaoqi/p/container-jvm.html
https://blog.csdn.net/lyy12332133/article/details/131311033
https://zhuanlan.zhihu.com/p/602433997
https://www.jianshu.com/p/040a1315bce5
https://blog.csdn.net/qq_26824159/article/details/130112077