inspect查看容器断开的原因

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"Id": "b6c047e33880579a8143a92c83b96562aaca8cd0e5089f3d2ba0df1d820cc35b",
"Created": "2025-01-22T03:58:34.723887312Z",
"Path": "java",
"Args": [
"-Xms512m",
"-Xmx2g",
"-Xss512k",
"-XX:MaxDirectMemorySize=512m",
"-XX:+UseContainerSupport",
"-jar",
"pml-admin.jar"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": true,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2025-03-05T08:00:06.251204387Z",
"FinishedAt": "2025-03-05T11:07:11.059290614Z"
}

ExitCode是退出码,137为内存溢出

查看容器内存限制

1
docker inspect pml | grep "Memory"

如果 Memory 值为 0,说明没有内存限制。如果有值,比如 2147483648(即 2GB),说明容器最多只能使用 2GB 内存,可能不够。

启用swap

  • 什么是Swap?

    Swap(交换空间)是一种 虚拟内存,当物理内存(RAM)不足时,操作系统会把不常用的内存数据 临时存放到硬盘(Swap 空间)上,以避免进程因内存不足而被杀死。

  • Swap的作用

    1. 防止 OOM(内存不足)
      • 当物理内存不够时,系统会把一些暂时不用的数据转移到 Swap,而不是直接杀死进程(例如你的 Java 进程)。
    2. 提升系统稳定性
      • 如果服务器运行多个进程,并且偶尔内存峰值较高,Swap 能起到缓冲作用,防止进程被强制终止。
    3. 支持更大的并发
      • 服务器可能需要运行多个应用,物理内存有限时,Swap 允许更好地分配资源,减少应用崩溃的风险。
  • Swap的缺点

    • 速度慢:Swap 依赖硬盘,访问速度远远慢于 RAM,使用过多会导致系统变慢(特别是 HDD)。
    • 可能影响性能:如果系统频繁使用 Swap,可能会导致 高 IO 负载,降低整体性能。
  • 💡 解决方案:

    • 建议只把 Swap 作为备用,不要让 Swap 变成主要内存!
    • 如果 Swap 使用量过高,说明物理内存不够,建议增加 RAM。
    • 对于 Java 应用,建议调整 -Xmx 以减少内存占用,而不是依赖 Swap。

创建swap(2g)

1
2
3
4
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

确认swap是否启用

1
free -m

让 Swap 在重启后仍然生效

1
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

附:启动容器的指令

1
2
3
4
docker run -d --memory="2g" --memory-swap="2g" -p 8080:8080 \
-v /root/pml/pml-admin.jar:/app/pml-admin.jar \
--name pml pml-admin \
java -Xms512m -Xmx2g -XX:+PrintFlagsFinal -jar /app/pml-admin.jar

当出现oom时生成dump日志

1
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof