title : 每日深耕,勤练不缀之java Docker

对于java来说,Docker毕竟是一个比较新的环境。例如,其内存、cpu等资源限制是通过CGroup实现的,早期的jdk版本并不能识别这些限制,进而会导致一些问题:

  • 如果未配置合适的JVM堆和元数据区,直接内存等参数;java有可能试图使用超过容器限制的内存,最终被容器OOM kill ,或者自身发生OOM
  • 错误的判断了可获取的CPU资源。如:Docker限制了CPU的核数,JVM就可能设置不合适的GC并行线程

与虚拟机及其相似,但是也有不同,并不是虚拟化技术,而是一种轻量级的隔离技术。轻量级的开销必然也就在成了许多微妙差异。
这就是所谓的Ergonomics机制,例如
JVM 会大概根据检测到的内存大小,设置最初启动时的堆大小为系统内存的 1/64;并将堆最大值,设置为系统内存的 1/4。
而 JVM 检测到系统的 CPU 核数,则直接影响到了 Parallel GC 的并行线程数目和 JIT complier 线程数目,甚至是我们应用中 ForkJoinPool 等机制的并行等级。
这些默认参数,是根据通用场景选择的初始值。但是由于容器环境的差异,Java 的判断很可能是基于错误信息而做出的。这就类似,我以为我住的是整栋别墅,实际上却只有一个房间是给我住的。
Java Docker

解决办法:升级到JDK8最新的更新

相关文章:

  • 2022-12-23
  • 2021-05-24
  • 2021-12-27
  • 2021-10-21
  • 2021-12-24
  • 2021-12-22
  • 2021-11-02
  • 2021-12-03
猜你喜欢
  • 2021-12-05
  • 2021-07-14
  • 2022-01-17
  • 2021-12-14
  • 2021-09-23
  • 2021-08-29
  • 2021-08-12
相关资源
相似解决方案