zoukankan      html  css  js  c++  java
  • 利用OpenJ9大幅度降低JAVA内存占用

    OpenJ9

    OpenJ9

    介绍

    • OpenJ9是一种高性能,可扩展的Java™虚拟机(VM)实现,完全符合Java虚拟机规范。

    • 在运行时,VM解释由Java编译器编译的Java字节码。VM充当语言与底层操作系统和硬件之间的翻译器。Java程序需要特定的VM才能在特定的平台(例如Linux®,z /OS®或Windows™)上运行。

    • OpenJ9 VM会自动检测它何时在docker容器中运行,并使用一种机制来检测VM何时处于空闲状态。当检测到空闲状态时,OpenJ9会运行垃圾回收周期,并将可用内存页释放回操作系统。还压缩对象堆,以充分利用可用内存来进行进一步的应用程序处理。对于基于内存使用量收费的云服务,保持较小的占用空间可以节省成本。

    好处

    • 内存占用少
    • 启动时间短
    • 吞吐量高
    • 更加适合微服务以及容器

    性能

    • 启动后占比减少66%
      启动后占比减少66%
      OpenJ9针对云工作负载进行了高度优化,在这些工作中,内存占用小非常重要。即使启用了其他优化,占用空间仍保持不变。

    • 高负载期间的占比减少了63%
      高负载期间的占比减少了63%
      当施加负载时,内存占用量迅速增加,但是在稳定状态下,带有OpenJ9的OpenJDK 8使用的物理内存比带有HotSpot的OpenJDK 8少大约63%。

    • 启动时间加快42%
      启动时间加快42%
      共享类和预编译(AOT)技术通常会减少启动时间。通过同时使用-Xquickstart模式,可以将启动时间最多减少42%。

    • 达到同样的吞吐量
      达到同样的吞吐量
      尽管带有OpenJ9的OpenJDK 8和带有Hotspot的OpenJDK 8都达到了相似的峰值吞吐量,但是带有OpenJ9的OpenJDK 8达到了约1分钟的峰值。

    • 在容器中的满载加速度
      在容器中的满载加速度
      OpenJ9在8.5分钟内达到单个CPU内核的峰值吞吐量,而Hotspot则为30分钟。对于在资源受限的环境(例如容器​​)中运行的短期VM而言,更快地执行更多工作非常重要。

    这些结果表明,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小时后内存占用情况:
    openjdk运行2小时后内存占用情况
    后续运行更久时甚至达到了90%以上。
    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小时后内存占用情况:
    openj9运行2小时后内存占用
    后续运行更久也没有明显变化。
    后续运行更久也没有明显变化

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

  • 相关阅读:
    事务隔离级别
    手机摄影之生活拍照技巧
    html.unescape(s)
    正则表达式编译和DOTALL小结
    重试模块==>retrying
    js逆向==>js2py
    mysql索引设计原则
    Django请求与响应
    Linux常用命令
    C++11 auto_ptr 的问题
  • 原文地址:https://www.cnblogs.com/muzishanhe/p/13218476.html
Copyright © 2011-2022 走看看