容器JVM限制

早期时候,容器内运行Java应用程序时,Jvm无法感知容器环境存在,所以对容器资源的限制比如内存或者cpu等都无法生效。

原因是容器的资源管理使用了操作系统cgroup机制,但是Jvm无法感知cgroup。

所以可能需要在jvm以及docker中指定两次内存限制。

后来,在Jvm9及以后,Jvm开始了对容器资源限制的支持。在Jvm11中,可以使用-XX:+UseContainerSupport参数来制定Jvm使用容器内存。

另外还有两个参数-XX:InitialRAMPercentage -XX:MaxRAMPercentage来制定Jvm使用容器内存的百分比。

1
2
3
-XX:+UseContainerSupport  #开启容器支持
-XX:InitialRAMPercentage=50 #初始使用百分比
-XX:MaxRAMPercentage=80 #最大使用百分比
1
2
3
jinfo -flags pid  #查看启动参数
jcmd pid VM.flags
jmap -heap pid #jhsdb jmap --heap --pid 1