我使用 eclipse-temurin jdk 21 作为 docker 基础镜像,并运行一个 java 应用程序。这是 dockerfile:
FROM 192.168.1.2:8084/eclipse-temurin:21-jdk
RUN mkdir -p /app
WORKDIR /app
COPY ./app-start/target/app-core-service.jar app-core-service.jar
ENV TZ=Asia/Shanghai
EXPOSE 8080
CMD java ${JVM_OPTS} -jar app-core-service.jar ${APP_ARGS} --spring.profiles.active=${SPRING_PROFILES_ACTIVE}
这是java应用程序
APP_ARGS
配置:
-Xss512k -Xms128m -Xmx450m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:31201 -Dcat.enabled=true -Dcat.name=app-core-service-dev
这是 kubernetes 资源限制配置:
resources:
limits:
cpu: 2048m
memory: 1Gi
requests:
cpu: 1024m
memory: 512Mi
但是 kubernetes pod 会通过 OOMKill 重新启动。为什么已经过了 1GB 内存的 Pod 限制,内存还是不够用?当增加内存时,OOMKill消失。 pod如何使用另外512MB内存?
JVM 还使用非堆内存,例如线程堆栈或映射的本机内存。这取决于您使用的应用程序和库,并且不能笼统地回答。