0%

在 Docker 容器中配置 Java Heap Size

CentOS

1
2
yum install git -y
git clone https://github.com/csongyu/container-heap-size.git

8u121-jdk-alpine

构建镜像

1
./build_image.sh 8u121-jdk-alpine

运行镜像

默认配置

1
2
3
4
5
6
# JVM 基于 RAM 计算 -Xmx -Xms
./run_image.sh 8u121-jdk-alpine

Initial Memory (xms): 60mb
Max Memory (xmx): 832mb
VM Info: OpenJDK 64-Bit Server VM 25.121-b13

配置 --memory

1
2
3
4
5
6
7
8
9
10
11
12
# 旧版本 JVM 未感知到分配给容器的内存,错误计算 -Xmx -Xms
./run_image.sh 8u121-jdk-alpine 200m

Initial Memory (xms): 60mb
Max Memory (xmx): 832mb
VM Info: OpenJDK 64-Bit Server VM 25.121-b13

# 尝试申请 200mb 内存(软引用)
# 由于 JVM 错误计算 -Xmx,因此在达到容器内存限制(200mb)前未触发 GC(-Xmx 832mb,832mb > 200mb),导致 Docker 杀掉此进程
./run_image.sh 8u121-jdk-alpine 200m "" 200

Killed

配置 --memory 和 -Xmx -Xms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 手动配置 -Xmx -Xms
./run_image.sh 8u121-jdk-alpine 200m "-Xmx100m -Xms100m"

Initial Memory (xms): 100mb
Max Memory (xmx): 94mb
VM Info: OpenJDK 64-Bit Server VM 25.121-b13

# 尝试申请 200mb 内存(软引用)
# 通过配置 -Xmx -Xms 防止 Docker 杀掉进程(-Xmx 100mb,100mb < 200mb)
./run_image.sh 8u121-jdk-alpine 200m "-Xmx100m -Xms100m" 200

Used Memory: 48mb
Initial Memory (xms): 100mb
Max Memory (xmx): 90mb

8u212-jdk-alpine

构建镜像

1
./build_image.sh 8u212-jdk-alpine

运行镜像

默认配置

1
2
3
4
5
6
# JVM 基于 RAM 计算 -Xmx -Xms
./run_image.sh 8u212-jdk-alpine

Initial Memory (xms): 60mb
Max Memory (xmx): 832mb
VM Info: OpenJDK 64-Bit Server VM 25.212-b04

配置 --memory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新版本 JVM 感知到分配给容器的内存,正确计算 -Xmx -Xms
./run_image.sh 8u212-jdk-alpine 200m

Initial Memory (xms): 8mb
Max Memory (xmx): 96mb
VM Info: OpenJDK 64-Bit Server VM 25.212-b04

# 尝试申请 200mb 内存(软引用)
# 由于 JVM 正确计算 -Xmx, 因此在达到容器内存限制前触发 GC,防止 Docker 杀掉进程
./run_image.sh 8u212-jdk-alpine 200m "" 200

Used Memory: 32mb
Initial Memory (xms): 8mb
Max Memory (xmx): 96mb
VM Info: OpenJDK 64-Bit Server VM 25.212-b04