【每日阅读】2021年3月17日-Java程序运行在docker等容器环境有哪些问题?

有疑问就留言给我吧😄

Docker的内存、CPU资源限制是通过CGroup实现的,早期版本的JDK(8u131之前)并不能识别这些限制,就会导致一些问题。

  1. 不能识别内存限制,导致使用的内存超过容器的限制,最终被容器 OOM kill,或者自身发生 OOM。
  2. 错误判断了可获取的 CPU 资源,例如,Docker 限制了 CPU 的核数,JVM 就可能设置不合适的 GC 并行线程数等。

Docker 并不是一种完全的虚拟化技术,而更是一种轻量级的隔离技术。

【每日阅读】2021年3月17日-Java程序运行在docker等容器环境有哪些问题?

容器虽然省略了虚拟操作系统的开销,实现了轻量级的目标,但也带来了额外复杂性,它限制对于应用不是透明的,需要用户理解 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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

GitHub
分享本页
返回顶部