更换JDK版本为Dragonwell并进行JVM调优

Dragonwell是阿里开源的JDK,作为一名国内Java开发人员,阿里的地位和Spring是一样的,是阿里带动了国内Java社区发展。Dragonwell声称比原版的JDK性能更好更稳定,且拥有很多特色功能,那为什么不支持一下呢😁?更换JDK的同时基于最近看过的美团技术年货的分享对JVM参数进行简单调优。

更换JDK版本为Dragonwell

下载Dragonwell

进入Dragonwell官网,选择Dragonwell 11复制下载地址。
在这里插入图片描述

cd /usr/local/src
wget https://dragonwell.oss-cn-shanghai.aliyuncs.com/11.0.14.10/Alibaba_Dragonwell_11.0.14.10_x64_linux.tar.gz

替换原有JDK

由于我的JDK安装地址是/usr/local/jdk,没有携带版本信息,因此我只需把老的JDK备份,新的安装原来的路径名移动就行。

mv /usr/local/jdk /usr/local/jdk.bak
cd /usr/local/src
tar -zxvf Alibaba_Dragonwell_11.0.14.10_x64_linux.tar.gz
mv /usr/local/dragonwell_11.0.14.10+0-GA /usr/local/jdk

JVM简单调优

稳定的堆、新生代大小、和方法区

为了避免项目初始化后导致的频繁GC,尽量将成对出现的空间大小配置参数设置成固定的,如-Xms和-Xmx-XX:MaxNewSize和-XX:NewSize,-XX:MetaSpaceSize和-XX:MaxMetaSpaceSize。

在不确定项目JVM使用情况的情况下,不要设置固定的新生代和元空间大小,要不然可能会导致错误。——2023年1月29日

使用CMS垃圾收集器

JDK11了还用CMS😅。

CMS在小堆的环境下性能还是目前最好的并发垃圾收集器,市面上大部分的性能测试结果都是在堆是8G以下的环境中CMS性能优于G1和ZGC,且堆越小CMS优势越明显。

本人的服务器4G小内存只给JVM分了2G的堆大小,CMS实在是最合适不过了🤣。

使用-XX:+UseConcMarkSweepGC开启CMS垃圾收集器。降低触发CMS GC的阈值,即参数-XX:CMSInitiatingOccupancyFraction的值,让CMS GC尽早执行,以保证有足够的连续空间,也减少Old区空间的使用大小,另外需要使用-XX:+UseCMSInitiatingOccupancyOnly来配合使用,不然JVM仅在第一次使用设定值,后续则自动调整。一般没有使用动态类加载或者DSL处理等,MetaSpace的使用率上不会有什么变化,这种情况可以通过-XX:-CMSClassUnloadingEnabled来避免MetaSpace的处理。

其他可能有用的参数

禁用偏向锁:偏向锁在只有一个线程使用到该锁的时候效率很高,但是在竞争激烈情况会升级成轻量级锁,此时就需要先消除偏向锁,这个过程是STW的。如果每个同步资源都走这个升级过程,开销会非常大,所以在已知并发激烈的前提下,一般会禁用偏向锁-XX:-UseBiasedLocking来提高性能。

虚拟内存:启动初期有些操作系统(例如Linux)并没有真正分配物理内存给 JVM,而是在虚拟内存中分配,使用的时候才会在物理内存中分配内存页,这样也会导致GC时间较长。这种情况可以添加-XX:+AlwaysPreTouch参数,让VM在commit内存时跑个循环来强制保证申请的内存真的commit,避免运行时触发缺页异常。在一些大内存的场景下,有时候能将前几次的GC时间降一个数量级,但是添加这个参数后,启动的过程可能会变慢。

CodeCache:指定JIT代码缓存大小XX:ReservedCodeCacheSize。XX:+SegmentedCodeCache指定整体初始化,还是分段初始化。

压缩:开启对象指针压缩-XX:+UseCompressedOops,开启类指针压缩-XX:+UseCompressedClassPointers。

最终配置

-Xms2048m -Xmx2048m -XX:ReservedCodeCacheSize=256m -Xss256k -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-CMSClassUnloadingEnabled -XX:+AlwaysPreTouch -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+SegmentedCodeCache -XX:-UseBiasedLocking

参考资料

美团技术年货-Java中9种常见的CMS GC问题分析与解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值