堆内存设置

Java 程序中,我们通常比较关注堆的使用情况,一般通过 -Xmx-Xms 分别控制最大和最小可用堆内存大小。在容器环境中,如果不显式指定堆内存参数,老的 JVM 版本是无法感知容器的资源限制的。在新的 JDK 8u191 版本以后,我们已经可以享受到新版 JVM 对容器的良好支持,并且可以通过 -XX:InitialRAMPercentage-XX:MaxRAMPercentage 控制堆内存启动时和最大可用内存百分比。考虑到堆外内存的使用,-XX:MaxRAMPercentage 不宜设置过高,具体值可以根据自己应用的情况灵活设置。需要注意的是百分比需要包含一位小数,否则会报错。文末有 Dockerfile 可供参考。

jmap 等 JVM 诊断工具无法正常使用

由于容器的特殊性,应用启动时的进程 ID 其实是 1, jmap/jstat/jstack 等诊断工具依赖底层的 PTRACE_ATTACH, 而由于 docker 后期版本的安全加固原因,这种操作是不允许的。因此我们可以想办法让 JVM 应用不以 PID 1 运行即可,但又能正常接收来自容器的停止等信号,这就是 krallin/tini 的用武之地了!

CPU 核数

TODO

Dockerfile

devops/Dockerfile 是我自用的 JDK 的基础镜像(基于 Alpine, JDK 8u191) 包含阿里的 Arthas 诊断利器,已设置时区为东八区。