利用 OpenJ9 大幅度降低 Java 内存占用

2020-07-01 12:05:25 +08:00
 louislivi

OpenJ9

介绍

好处

性能

这些结果表明,OpenJ9 在(通常是相互冲突的)性能指标之间达到了良好的平衡:借助 AOT 技术,它可以节省大量的空间并缩短启动时间,同时还提供与 Hotspot 竞争的吞吐量性能。 由于其内存占用量低,OpenJ9 特别适合于云计算环境,在这种环境中,节省内存可为云用户和提供商节省成本。

实际使用

目前我的项目是一个基于 Spring Boot 开发的,项目中加入了大量定时器以及多线程,网络 IO 请求,数据计算等。生产环境部署方式采用的Docker,之前是采用的官方的openjdk镜像,目前已经改为了openj9,至于为什么请看以下数据。

我这里以比较突出的内存占用进行比较。

服务器配置

2 核 4G

openjdk

对应的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%以上。

openj9

对应的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 小时后内存占用情况: 后续运行更久也没有明显变化。

最后从数据看来结果,内存占用真的低,非常节省服务器资源,相同负载下至少节省一半的服务器资源。 值得推荐大家去尝试。

7749 次点击
所在节点    Java
25 条回复
gz911122
2020-07-01 12:14:25 +08:00
挺有意思的.. 收藏了. 下次试试.
tt0411
2020-07-01 12:28:18 +08:00
OpenJ9 对于 sun.* 包支持如何?
whileFalse
2020-07-01 12:37:02 +08:00
好奇它是怎么做到的
GM
2020-07-01 14:58:18 +08:00
已经在我公司生产环境用了半年多了,具体性能多好、多省内存目前没感觉 ,因为业务量还没触及服务器极限。

但是说没稳定性是没问题的。
cubecube
2020-07-01 15:18:02 +08:00
我记得看过很多分析测评,速度不如官方。
nutting
2020-07-01 15:20:51 +08:00
个人开发呢,也想省点内存
wysnylc
2020-07-01 15:48:58 +08:00
对个人开发者持保守态度
GM
2020-07-01 15:50:15 +08:00
@wysnylc OpenJ8 是 IBM 出品的,并不是个人开发者。
donnior
2020-07-01 16:02:13 +08:00
wysnylc
2020-07-01 16:05:36 +08:00
@GM #8 还以为是个人的呢,孤陋寡闻了
cheng6563
2020-07-01 16:08:05 +08:00
加密库貌似有点差别
liamyoung
2020-07-01 16:10:42 +08:00
看一遍官方文档,还不错
raphael008
2020-07-01 17:22:24 +08:00
openj9 挺好的一直在用没啥 performance issue,因为公司只让用自家的😂(
Anarchy
2020-07-01 17:37:38 +08:00
我用 AndroidStudio 内存总是紧张,个人电脑装个看看有效果没
keshawnvan
2020-07-01 19:48:20 +08:00
之前试过,内存确实降了不少
yanzhiling2001
2020-07-01 20:34:29 +08:00
yuekcc
2020-07-01 21:49:31 +08:00
在生产环境也用过一段时间。稳定性没有问题,内存占用的确更少,适合在单机上部署多个服务。性能估计会比 hotspot 弱一些,没有仔细压测,有得有失吧。就是感觉开发有点慢。

@yanzhiling2001 手动点赞
salmon5
2020-07-01 22:57:06 +08:00
建议 hotspot 用 adoptopenjdk:8-jdk-hotspot
openbsd
2020-07-02 10:02:24 +08:00
IBM 优化版 ?
hantsy
2020-07-02 11:54:37 +08:00
运行时内存占用,和 Java 应用的实际性能不完全是一回事。从我以前看到的一些文章来看,OpenJ9 在 X86 架构上,整体性能并没什么优势,很多方面甚至落后 Hotspot 很远。以前在 X86 上性能最出色的 BEA 的 JRocket 。BEA 被 Oracle 收购,现在 JRocket 优秀的部分不知道有没有进入 OpenJDK 。

@tt0411 你这个是 Java 语言 API 层面的,和底层 JVM 实现没关系。AdoptOpenJDK 有针对不同的 JVM 打包的版本。com.sun 在实际项目中要避免使用,IBM 的 JDK 就可能就不包含这些 API 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686196

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX