From 2b1c6ccb73101121d59d66fa173902fa97f2aa34 Mon Sep 17 00:00:00 2001 From: promise_cyf <15731060594@163.com> Date: Sat, 10 Oct 2026 15:58:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9jvm=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 13 ++++++++++++- docker-compose.yml | 6 ++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8beae65..886ac62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,18 @@ FROM eclipse-temurin:21-jre WORKDIR /app ENV TZ=Asia/Shanghai + +# JVM 默认参数(4H4G + 已跑 Redis/Gitea/Ollama 的低配场景): +# -Xms256m / -Xmx512m 堆固定,避免 JVM 猜着吃;不够再上调 +# ExitOnOutOfMemoryError OOM 时直接退出,交给 Docker 重启,比卡死强 +# HeapDumpOnOutOfMemoryError 出事时留一份堆快照便于排查 +# 想运行时调整:compose 里覆盖环境变量 JAVA_OPTS 即可 +ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof" + # 本目录下放且仅放一个 jar(.dockerignore 已排除 target/,避免误打包) COPY *.jar app.jar EXPOSE 8077 -ENTRYPOINT ["java", "-jar", "/app/app.jar"] + +# sh -c "exec ..." 方式:先解析 $JAVA_OPTS,再用 exec 把 java 替换 sh 作为 PID 1, +# 这样 docker stop 发的 SIGTERM 能被 JVM 正常接收、Spring Boot 走完 shutdown hook +ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/app.jar"] diff --git a/docker-compose.yml b/docker-compose.yml index 1bb7f18..baaccbd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,3 +35,9 @@ services: # 让容器能通过 host.docker.internal 访问宿主机(Linux 上必需) extra_hosts: - "host.docker.internal:host-gateway" + + # 内存硬限制:4H4G 机器上给 app 1G 足够(堆 512m + 堆外/线程/元空间等)。 + # 配合 Dockerfile 里的 -Xmx512m,触顶会被 cgroup OOM kill,让 Docker 重启。 + # 调整 JVM 堆:覆盖 JAVA_OPTS 环境变量即可,无需改 Dockerfile + mem_limit: 1024m + mem_reservation: 512m