文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

有哪些值得收藏的JVM调优技巧?

2024-12-01 01:52

关注

最近项目一直在跑性能测试,看到程序的MinorGC频率增高, 每分钟GC时间增大,心里总是会忐忑,待会儿不会又有503吧。

前言

对于Java程序员来说,GC总是绕不过去的一个知识点,总有那么一刻必然会用到这些内容。

只是书到用时方恨少,需要进行GC优化的时候再去看GC的每一步的详细内容也难以快速完成任务。

这一篇内容就只有满满的干货,可以说是拿来即用。下面我们废话少说,走起。

1.GC算法种类

目前OpenJDK中有以下几种常见的GC算法。

目前大多数的人使用Java8居多。如果没有明确指定GC算法,那么Java8会使用默认Parallel GC。Java9开始 ,默认GC 是G1 GC算法。Java 17 默认也是G1 GC,其中个别版本会有点差异。

下面是常用GC算法使用命令。

GC Algorithm

JVM argument

Serial GC

-XX:+UseSerialGC

Parallel GC

-XX:+UseParallelGC

CMS GC

-XX:+UseConcMarkSweepGC

G1 GC

-XX:+UseG1GC

ZGC

-XX:+UseZGC

网上大多数人都对ZGC算法的性能比较称赞,如果是使用Java11以上的版本,那么可以考虑使用ZGC。奈何大多数同学们包括笔者都在Java8中久久不能自拔,所以我们这一篇就避开ZGC吧。

2. JVM的一些重要参数

JVM中的参数分为3类:

关于非标准参数,我们使用 java -X 命令 即可找到这些参数,

3.使用哪种GC最合适

既然大多数同学都使用Java8,那么一定会在Parallel GC 和G1 GC中选择了。

关于那种GC最合适,我们下面分别来看看。

3.1 如果选择ParallelGC

ParallelGC是Java8的默认GC算法,对于新生代其使用Parallel Scavenge (复制算法),老年代垃圾回收则不同。

有两种组合:

3.1.1 Parallel Scavenge

Parallel Scavenge 是新生代并行回收器,使用复制算法。主要关注的是吞吐量,吞吐量就是JVM运行期间非垃圾回收用时百分比。

Parallel Scavenge 收集器控制吞吐量有两个重要参数:

其值为大于0的毫秒数,垃圾收集器尽可能保证回收的耗时不超过设定的值,但是并不是越小越好,如果值设置太小,那么GC的频率会提高,这样吞吐量就降低了。

其值为0-100的整数,表示吞吐量,默认值是99,表示允许1%的垃圾回收时间占比。

启用这个参数之后,JVM会根据当前系统运行情况收集监控信息,动态调整新生代的比例等等。如果设置了这个参数之后,就不需要在设置新生代大小,Eden以及 S0/S1的比例等参数。

3.1.2 Parallel Old

Parallel Old 是老年代垃圾回收器,负责Full GC ,是一个并行垃圾回收器,整理老年代的时候,是基于“标记-整理”算法,

Parallel Old算法分为3各部分,

-XX:+ScavengeBeforeFullGC ScavengBeforeFullGC 是 Parallel GC中的一个参数,默认开启。其作用就是在一次FullGC之前先触发一次Young GC 来清理新生代,以降低Full GC时 STW的耗时,

3.1.3 ParallelGC调优

Parallel GC会尽量去满足如下目标:(优先级由高到低)

对ParallelGC的调优,其目标应尽可能避免Full GC, 这就需要优化对象老年化的频率,

使用ParallelGC时,垃圾收集的资源开销应小于5%,如果已经减少到1%甚至更少,基本上已经达到极限了。

-Xmn1024m   //新生代大小
-XX:-UseAdaptiveSizePolicy //关闭自适应调整

-XX:SurvivorRatio 可以调整新生代中Survivor与Eden区的比例,例如-XX:SurvivorRatio=6表示S(From) : S(To) : Eden = 1: 1: 6 。其默认值为8

如果发现GC频率过高,整体新生代又太小,可以增大新生代的大小,从而降低YoungGC的频率和占用时间。

可以调小 SurvivorRatio的值,在整个新生代不变的情况下,会增大Survivor区的大小(From和To同时增大)。一般情况下Eden区的大小应该比Survivor大很多,如果大量对象都在一次YoungGC后就会回收清理,那么新生代Eden:From:To 为8:1:1就比较合适。如果说很大部分对象的年龄都超过1,即需要在Survivor的From,To中来回转换几次之后才能被回收,那么此时可以适当增大一下Survivor区的空间,并且可以将Survivor的空间使用率增大,避免对象年龄增长过快,从而被移动到老年代,造成FullGC。

-XX:-UseAdaptiveSizePolicy  //需要关闭Survivor自适应
-XX:TargetSurvivorRatio=<n> //Suvivor空间的使用率,默认是50%
-XX:MaxTenuringThreshold=15 //存活对象年龄,默认15,
-XX:ParallelGCThreads= 

此参数设置年轻代并行收集器的线程数,一般与CPU数量相等,过多的线程数量会影响垃圾回收以及整个程序的性能。

默认情况下,当CPU的数量小于8,其值等于CPU数量

CPU数量大于8个,其值等于3+5*CPU数量 / 8

-XX:MaxGCPauseMills=<N> //最大停顿时间,值大于0的毫秒数

垃圾收集器为了将最大停顿时间控制在此参数内,收集器会调整堆的大小和其他的参数。

对于用户体验,停顿越短越好,在服务端,会比较注重高并发和高吞吐量。

-XX:GCTimeRatio=99 //吞吐量

其值为0-100的整数,表示吞吐量,默认值是99,表示允许1%的垃圾回收时间占比。暂停时间越长,那么垃圾回收占用的时间比越大,可能会超过前面的设定比例。

3.2 如果选择G1

Garbage-First 垃圾回收器是服务器类型的垃圾回收器,主要针对大内存多处理器机器。其主要目标也是低暂停时间,高吞吐量,全局标记。

来源:Java技术指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯