首页 > 解决方案 > 如何在 Heroku 中使用 Docker 调试意外的高内存使用?

问题描述

我正在将 Docker 中的一个小应用程序部署到 Heroku。我在本地运行时看到的问题,设置最多需要 400 MB。在 Heroku 上,在运行时,它会飙升至 1.7 GB 的 RAM。

Dockerfile:

FROM bellsoft/liberica-openjdk-alpine-musl:11
ENV PORT=$PORT
ARG ENV
ENV STARTUP_ENV=$ENV
COPY /target/app-0.0.1-SNAPSHOT.jar /app-0.0.1-SNAPSHOT.jar
RUN echo $ENV
CMD java -Dspring.profiles.active=$STARTUP_ENV -Djava.security.egd=file:/dev/./urandom -Dserver.port=$PORT -jar /app-0.0.1-SNAPSHOT.jar

我无法显示代码,但 visualvm 显示 Kotlin 应用程序从未达到超过 80 MB 的 RAM 基准。

我该如何调试这个问题?

PS 应用程序在运行时自动重启的主要问题,我丢失了关键数据。

更新:

由于我没有回答,所以我在Heroku repo中提出了一个问题。

标签: dockerdebuggingheroku

解决方案


这纯粹是 Docker 内部的 java 问题,而不是 Heroku 问题。

我忘了指定-Xms-Xmx键。请注意,默认情况下它们是不同的,因此您需要明确指定允许的 RAM 量,以防止 Heroku 在一段时间后不断地重新启动您的应用程序。

我的 Docker 文件示例:

FROM azul/zulu-openjdk-alpine:11
ENV PORT=$PORT
ARG ENV
ENV STARTUP_ENV=$ENV
ENV VERSION=0.0.1

COPY /target/app-$VERSION.jar /app-$VERSION.jar
RUN echo $ENV
CMD java -Xms256m -Xmx512m -Dspring.profiles.active=$STARTUP_ENV -Djava.security.egd=file:/dev/./urandom -Dserver.port=$PORT -jar /app-$VERSION.jar

推荐阅读