前言
因开发了一个开源项目 ZFile,提供 Docker 版本,最初构建镜像时,使用的是 alpine 因为大小只有 5MB,然后在此基础上,添加了 jdk、wget、unzip 等包,最终打包为 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 官网查看详细信息:www.eclipse.org/openj9/
openj9 针对云环境和 Docker 运行环境进行了优化,并提升了启动速度,降低内存占用。详细性能对比见官方示例:www.eclipse.org/openj9/perf…