0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JVM的一些重要参数

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-25 15:56 次阅读

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

1.GC算法种类

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

  • Serial GC
  • Parallel GC
  • CMS GC (Concurrent Mark & Sweep)
  • G1 GC
  • Z GC

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

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

GC AlgorithmJVM 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类:

  • 标准参数(-),所有的JVM都必须实现这些参数的功能,并且必须向后兼容. 如java -version等
  • 非标准参数(-X),默认JVM实现这些功能,不保证所有的JVM都能使用,且不向后兼容。
  • 非Stable参数(-XX),这些参数每个JVM实现都会不同,而且将来可能取消,需要谨慎使用

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

  • -Xmn 新生代内存大小,包括E区和两个S区,使用方法如下:-Xmn65535,-Xmn2048k,-Xmn512m, -Xmn2g (-Xms,-Xmx 也是同一种写法)
  • -Xms 初始堆的大小,堆大小的最小值,默认值是物理内存的1/64(小于1G), 默认情况下,如果堆中可用内存小于40%时(调整参数 -X:MinHeapFreeRatio=40),堆内存会开始增加,一直增加到-Xmx的大小
  • -Xmx 堆的最大值,默认是物理内存的1/64,如果Xms和Xmx都不设置的话,两者的大小会相同,默认情况下,当堆中可用内存大于70%时(调整参数 -X:MaxHeapFreeRatio=70),堆内存会开始减少,一直减少到-Xms的大小
  • -Xss 线程的栈内存,默认时1m, 如果项目使用lombok过多的情况下,编译的时候可能会有栈溢出,就需要配置多一点栈内存。
  • -XX:MaxTeurningThreashold 新生代存活对象晋升到老年代的年龄阈值,对象头中存储age用了4个bit,所以其最大值为15。默认值是15,如果年轻代垃圾回收后总有一段时间内存的占用仍然保持在某一个高位,过一段时间恢复正常。那么可以适当降低年龄阈值,让存活对象更早的进入到老年代,提高年轻代的可用率。

3.使用哪种GC最合适

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

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

3.1 如果选择ParallelGC

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

有两种组合:

  • 使用 -XX:UseParallelGC 参数,新生代使用 Parallel Scavenge 垃圾回收算法 ,老年代使用PSMarkSweep(Serial Old)垃圾回收算法(标记-整理算法)。
  • 使用 -XX:UseParallelOldGC 参数, 新生代使用 Parallel Scavenge 垃圾回收算法,老年代使用Parallel Old垃圾回收算法(标记整理算法)。
3.1.1 Parallel Scavenge

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

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

  • 最大停顿时间 -XX:MaxGCPauseMills=100
    其值为大于0的毫秒数,垃圾收集器尽可能保证回收的耗时不超过设定的值,但是并不是越小越好,如果值设置太小,那么GC的频率会提高,这样吞吐量就降低了。
  • 控制吞吐量大小 -XX:GCTimeRatio=99
    其值为0-100的整数,表示吞吐量,默认值是99,表示允许1%的垃圾回收时间占比。
  • -XX:UseAdaptiveSizePolicy 自动调节新生代大小比例
    启用这个参数之后,JVM会根据当前系统运行情况收集监控信息,动态调整新生代的比例等等。如果设置了这个参数之后,就不需要在设置新生代大小,Eden以及 S0/S1的比例等参数。
3.1.2 Parallel Old

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

Parallel Old算法分为3各部分,

  1. Mark:将老年代的内存,划分为大小固定的多个连续的Region,标记完存活对象之后,统计每个Region的存活对象数量。Mark阶段采用串行标记所有从GC Roots可直达的对象,并行标记所有存活的对象。
  2. Summary:某个Region的密度 = 存活对象的内存大小/Region内存大小,Summary阶段会从左向右计算各个Region的密度,然后找到一个平衡点,这个平衡点左侧的Region都不会进入下一个回收阶段,另外一侧的Region则需要进入到下一个阶段进行回收。相当于只回收部分Region,Summary阶段是串行执行阶段。
  3. Compaction:利用Summary阶段的统计数据,针对需要整理的部分,采用“整理”算法进行操作
  • -XX:+ScavengeBeforeFullGC ScavengBeforeFullGC 是 Parallel GC中的一个参数,默认开启。其作用就是在一次FullGC之前先触发一次Young GC 来清理新生代,以降低Full GC时 STW的耗时,
3.1.3 ParallelGC调优

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

  • 最大停顿时间目标
  • 吞吐量目标
  • 最小移动目标

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

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

  • Survivor调优:ParallelGC可以自动调整Survivor空间,大部分的程序使用自动调整可以满足要求,个别应用在需要的情况下可以关闭自动调整,进行手动调整。

    -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=<  N >
    

    此参数设置年轻代并行收集器的线程数,一般与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 垃圾回收器是服务器类型的垃圾回收器,主要针对大内存多处理器机器。其主要目标也是低暂停时间,高吞吐量,全局标记。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6514

    浏览量

    87609
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72777
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103000
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12129
  • JDK
    JDK
    +关注

    关注

    0

    文章

    77

    浏览量

    16489
收藏 人收藏

    评论

    相关推荐

    求助一些基础电子元件参数测试方法

    本人刚进入测试行业,没有经验,在学校也没接触过测试电子元件方面的东西,跪求各位大神分享一些基础的电子元件参数的测试方法。跪求!!!!!!!!
    发表于 05-23 09:37

    关于运放的一些参数讨论

    目前项目上用的运放、DAC、ADC基本都是ADI公司的产品,例如AD8541、AD8009、DAC7568、AD5312、AD7352、ADR4525等系列产品,这里重点对应的一些参数进行说明,并
    发表于 10-25 09:30

    jvm参数配置问题怎么解决

    jvm参数配置问题
    发表于 05-05 17:29

    常用的一些伺服电机参数有哪些?

    常用的一些伺服电机参数有哪些?
    发表于 09-24 11:44

    L298N的一些基本参数是什么?

    L298N的一些基本参数是什么?ENA和ENB上面的跳线帽要不要拔去?
    发表于 12-21 06:40

    看看基于JDK中自带JVM工具的用法

    查询很多参数的默认值;该命令还可以在运行时动态调整部分参数,只是很少被使用;3、jstat命令jstat :以指定的频率输出JVM的监控指标,下述命令输出内存占用和GC相关信息,每隔3秒输出
    发表于 11-16 15:30

    垃圾收集器的JVM参数配置

    本篇文章我们就来给大家介绍垃圾收集器的 JVM 参数配置。 JVM参数有很多,其实我们直接使用默认的JVM
    的头像 发表于 10-09 16:35 245次阅读
    垃圾收集器的<b class='flag-5'>JVM</b><b class='flag-5'>参数</b>配置

    jvm的dump太大了怎么分析

    分析大型JVM dump文件可能会遇到的一些挑战。首先,JVM dump文件通常非常大,可能几百MB或几个GB。这是因为它们包含了JVM的完整内存快照,包括堆和栈的所有对象和线程信息。
    的头像 发表于 12-05 11:01 826次阅读

    jvm调优参数

    JVM(Java虚拟机)是Java程序的运行环境,它负责解释Java字节码并执行相应的指令。为了提高应用程序的性能和稳定性,我们可以调优JVM参数JVM调优主要涉及到堆内存、垃圾
    的头像 发表于 12-05 11:29 345次阅读

    jvm参数的设置和jvm调优

    JVM(Java虚拟机)参数的设置和调优对于提高Java应用程序的性能和稳定性非常重要。在本文中,我们将详细介绍JVM参数的设置和调优方法。
    的头像 发表于 12-05 11:36 507次阅读

    jvm调优常用命令

    JVM调优是提升Java应用性能的一个重要方面,通过合理设置JVM参数可以达到优化应用性能、提高系统稳定性的目的。本文将为你详细介绍JVM
    的头像 发表于 12-05 11:43 358次阅读

    jvm配置堆内存初始值参数

    程序中,堆内存的初始值是非常重要的,它决定了程序在运行过程中能够使用的内存大小。因此,在优化JVM性能的过程中,对于堆内存初始值的合理配置是至关重要的。 首先,我们需要了解JVM中堆内
    的头像 发表于 12-05 14:17 321次阅读

    jvm配置metaspace最大值的参数

    堆内存限制):该参数用于设置JVM堆的最大大小。在JVM启动时,可以使用以下命令来配置Metaspace的最大大小: java -Xmx ... 其中,``可以是一些表示大小的标记
    的头像 发表于 12-05 14:21 732次阅读

    weblogic jvm参数配置

    在WebLogic中,JVM参数配置是非常重要的,它可以对应用程序的性能和稳定性产生直接影响。JVM参数通过调整Java虚拟机的运行时行为,
    的头像 发表于 12-05 14:31 514次阅读

    weblogic控制台配置jvm参数

    WebLogic Server是一个用于构建、部署和管理大规模分布式应用程序的Java EE应用服务器。在WebLogic控制台中配置JVM参数非常重要,它可以影响应用程序性能和服务器的稳定性。本文
    的头像 发表于 12-05 14:48 1138次阅读