3

优化 Java 项目 Docker 镜像内存占用从 500 M 到 100M

 2 years ago
source link: https://zhaojun.vip/archives/42/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

因开发了一个开源项目 ZFile,提供 Docker 版本,最初构建镜像时,使用的是 alpine 因为大小只有 5MB,然后在此基础上,添加了 jdkwgetunzip 等包,最终打包为 alpine-java 大小为 108MB,但实际运行内存占用会在 400m - 600m 之间,还挺占内存的。

经过搜索发现 openj9 比较省内存,下面是 Dockerfile示例 和运行内存占用对比。

Dockerfile

alpine-java

FROM zhaojun1998/alpine-java

WORKDIR /root

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

RUN wget -O app.jar https://c.jun6.net/ZFILE/zfile-release.jar

EXPOSE 8080

ENTRYPOINT java $JAVA_OPTS -jar /root/app.jar

openj9

FROM ibm-semeru-runtimes:open-8-jre

WORKDIR /root

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

RUN curl -o app.jar https://c.jun6.net/ZFILE/zfile-release.jar

EXPOSE 8080

ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /root/app.jar

镜像大小比较

根据上方的 Dockerfile 进行构建,通过 docker images 命令查看镜像大小,对比结果如下:

alpine-java 版本镜像大小为: 108MB

openj9 版本镜像大小为: 321MB

可以看出 alpine 系列镜像在镜像大小上还是占绝对优势的。

内存占用比较

通过 docker stats 命令查看运行中的 docker 容器内存占用情况如下:

alpine-java 版本镜像:刚运行占用内存 350m-450m左右,过一会能占用到 520m,我的演示站因运行时间比较长,占用到了 663m 内存。

openj9 版本镜像:刚运行占用内存在 90m-100m 左右,过一会能占用 110m-120m 左右,较长时间的运行还没来得及测试。

由此可以看出 openj9 在内存占用上占用降低了好几倍。

openj9 介绍

对比完,我们来看看 openj9 到底是什么来头,其实他是 IBM J9 JVM 贡献给 Eclipse 基金会后改名为 OpenJ9 ,现继续由 IBM 接管,可以从 openj9 官网查看详细信息:https://www.eclipse.org/openj9/

openj9 针对云环境和 Docker 运行环境进行了优化,并提升了启动速度,降低内存占用。详细性能对比见官方示例:https://www.eclipse.org/openj9/performance


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK