OpenJ9 是一种高性能,可扩展的 Java™虚拟机( VM )实现,完全符合 Java 虚拟机规范。
在运行时,VM 解释由 Java 编译器编译的 Java 字节码。VM 充当语言与底层操作系统和硬件之间的翻译器。Java 程序需要特定的 VM 才能在特定的平台(例如 Linux®,z /OS®或 Windows™)上运行。
OpenJ9 VM 会自动检测它何时在 docker 容器中运行,并使用一种机制来检测 VM 何时处于空闲状态。当检测到空闲状态时,OpenJ9 会运行垃圾回收周期,并将可用内存页释放回操作系统。还压缩对象堆,以充分利用可用内存来进行进一步的应用程序处理。对于基于内存使用量收费的云服务,保持较小的占用空间可以节省成本。
启动后占比减少 66 %
高负载期间的占比减少了 63 %
启动时间加快 42 %
达到同样的吞吐量
在容器中的满载加速度
这些结果表明,OpenJ9 在(通常是相互冲突的)性能指标之间达到了良好的平衡:借助 AOT 技术,它可以节省大量的空间并缩短启动时间,同时还提供与 Hotspot 竞争的吞吐量性能。 由于其内存占用量低,OpenJ9 特别适合于云计算环境,在这种环境中,节省内存可为云用户和提供商节省成本。
目前我的项目是一个基于 Spring Boot
开发的,项目中加入了大量定时器以及多线程,网络 IO 请求,数据计算等。生产环境部署方式采用的Docker
,之前是采用的官方的openjdk
镜像,目前已经改为了openj9
,至于为什么请看以下数据。
我这里以比较突出的内存占用进行比较。
2 核 4G
对应的Dockerfile
FROM openjdk:8-jdk-alpine
ADD target/app.jar app.jar
ENTRYPOINT [ \
"java", \
"-XX:MetaspaceSize=256m", \
"-XX:MaxMetaspaceSize=256m", \
"-Xms2048m", \
"-Xmx2048m", \
"-Xmn256m", \
"-Xss256k", \
"-XX:SurvivorRatio=8", \
"-XX:+UseConcMarkSweepGC", \
"-Duser.timezone=GMT+08", \
"-Djava.security.egd=file:/dev/./urandom", \
"-jar", \
"/app.jar", \
"--spring.profiles.active=prod" \
]
运行 2 小时后内存占用情况:
90%
以上。
对应的Dockerfile
FROM adoptopenjdk:8-jdk-openj9
ADD target/app.jar app.jar
ENTRYPOINT [ \
"java", \
"-XX:MetaspaceSize=256m", \
"-XX:MaxMetaspaceSize=256m", \
"-Xms2048m", \
"-Xmx2048m", \
"-Xmn256m", \
"-Xss256k", \
"-XX:SurvivorRatio=8", \
"-XX:+UseConcMarkSweepGC", \
"-Duser.timezone=GMT+08", \
"-Djava.security.egd=file:/dev/./urandom", \
"-Xshareclasses", \
"-Xquickstart", \
"-jar", \
"/app.jar", \
"--spring.profiles.active=prod" \
]
运行 2 小时后内存占用情况:
最后从数据看来结果,内存占用真的低,非常节省服务器资源,相同负载下至少节省一半的服务器资源。 值得推荐大家去尝试。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.