堆内存设置
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 诊断利器,已设置时区为东八区。