Docker的内存、CPU资源限制是通过CGroup实现的,早期版本的JDK(8u131之前)并不能识别这些限制,就会导致一些问题。
- 不能识别内存限制,导致使用的内存超过容器的限制,最终被容器 OOM kill,或者自身发生 OOM。
- 错误判断了可获取的 CPU 资源,例如,Docker 限制了 CPU 的核数,JVM 就可能设置不合适的 GC 并行线程数等。
Docker 并不是一种完全的虚拟化技术,而更是一种轻量级的隔离技术。
![【每日阅读】2021年3月17日-Java程序运行在docker等容器环境有哪些问题?-插图 【每日阅读】2021年3月17日-Java程序运行在docker等容器环境有哪些问题?](https://www.geekgao.cn/wp-content/themes/justnews/themer/assets/images/lazy.png)
容器虽然省略了虚拟操作系统的开销,实现了轻量级的目标,但也带来了额外复杂性,它限制对于应用不是透明的,需要用户理解 Docker 的新行为。所以,有专家曾经说过,“幸运的是 Docker 没有完全隐藏底层信息,但是不幸的也是 Docker 没有隐藏底层信息!”
可以通过一些参数来调整:
# JDK8u131之后以及JDK9 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap # JDK10以及之后 -XX:ActiveProcessorCount=N # 建议:明确限制内存和GC、JIT的并发 -e JAVA_OPTIONS='-Xmx300m' -XX:ParallelGCThreads -XX:CICompilerCount
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2884