JVM内存调优常用参数

视频讲解地址



一、开始


查看当前JDK版本所支持的垃圾回收器有哪些、以及默认使用的回收器

java -XX:+PrintFlagsFinal -version | grep -E '\<Use.*GC\>'

JDK8和JDK11运行上述命令结果如下:

在这里插入图片描述


各种组合GC的开关

名称描述
UseSerialGC年轻代和老年代都用串行收集器
UseParNewGC年轻代使用ParNew,老年代使用 Serial Old
UseParallelGC年轻代使用Paraller Scavenge,老年代使用Serial Old
UseParallelOldGC新生代Paraller Scavenge,老年代使用Paraller Old
UseConcMarkSweepGC表示年轻代使用ParNew,老年代的用CMS + Serial Old
UseG1GC使用G1垃圾回收器

  1. JDK8 默认是 Paraller Scavenge + Paraller Old ,JDK11默认是 G1 (其实JDK9开始默认是G1)。
  2. 在JDK11里面没有看到 ParNew,是因为 ParNew+Serial Old 这个组合已经不存在了。

注:

  1. 垃圾回收器和JDK的版本是有关系的,但目前主流的版本是8和11,所以此次学习也是用这两个版本
  2. 8和11默认的回收器分别是UseParallelGC和G1,既如此我们就深入理解它们
  3. 理解垃圾回收器无非是理论+各种参数,理论上篇已经解释了,此次就来看看这两款收集器的核心配置参数

二、常用命令


1、原生命令


注:pid 可以使用 jps/jcmd 查看

命令描述结果
jcmd pid VM.flags查看当前JVM参数在这里插入图片描述
jmap -heap pid查看当前堆信息(JDK11用不了)在这里插入图片描述
jcmd pid GC.heap_info查看各个区域内存使用情况,可以看Metaspace、和class space在这里插入图片描述
jstat -gc pid查看内存使用情况、且可以看到GC频率在这里插入图片描述

注: jstat -gc 结果描述

- `S0C`: 第一个幸存区(Survivor 0)的容量(Capacity)。
- `S1C`: 第二个幸存区(Survivor 1)的容量。
- `S0U`: 第一个幸存区的使用量(Used)。
- `S1U`: 第二个幸存区的使用量。
- `EC`: Eden 区的容量。
- `EU`: Eden 区的使用量。
- `OC`: 老年代的容量。
- `OU`: 老年代的使用量。
- `MC`: 元空间(Metaspace)的容量。
- `MU`: 元空间的使用量。
- `CCSC`: 压缩类空间的容量。
- `CCSU`: 压缩类空间的使用量。
- `YGC`: 年轻代垃圾回收的次数。
- `YGCT`: 年轻代垃圾回收的总时间。
- `FGC`: 老年代垃圾回收的次数。
- `FGCT`: 老年代垃圾回收的总时间。
- `CGC`: 全局垃圾回收的次数。
- `CGCT`: 全局垃圾回收的总时间。
- `GCT`: 所有垃圾回收的总时间。

2、arthas命令

命令描述图视
memory查看内存使用情况在这里插入图片描述

想了解arthas的小伙伴可以看这个: java线上问题排查工具——Arthas


三、Parallel


查看某个参数的值:jinfo -flag ParallelGCThreads pid

参数描述
ParallelGCThreads设置用于垃圾回收的线程数,通常设置为处理器数量的几倍。
MaxGCPauseMillis设置期望的最大垃圾收集停顿时间,Parallel GC会尝试调整各种参数以满足这个目标。
GCTimeRatio设置垃圾收集时间占总时间的比例。值为n,表示垃圾收集时间占总时间的1/(1+n)。比如19表示垃圾收集时间占总时间的1/20。
UseAdaptiveSizePolicy当这个参数激活后,就不需要人工指定新生代的大小、Eden和Survivor区的比例、晋升老年代对象的大小,虚拟机会动态的调整。

四、G1 相关参数


查看某个参数的值:jinfo -flag G1HeapRegionSize pid

参数描述备注
G1HeapRegionSize设置Region大小,并非最终值,会按照实际空间来看
MaxGCPauseMillis设置G1收集过程目标时间,默认 200ms
G1NewSizePercent新生代最小值在我这个版本JDK没有这个参数
G1MaxNewSizePercent新生代最大值,默认值60%在我这个版本JDK没有这个参数
ParallelGCThreadsSTW期间,并行GC线程数
ConcGCThreads并发标记阶段,并行执行的线程数
InitiatingHeapOccupancyPercent设置触发标记周期的 Java 堆占用率阈值。默认值是45%。这里的java堆占比指的是non_young_capacity_bytes,包括old+humongous

在这里插入图片描述


五、通用参数


参数描述
Xmx设置JVM的最大堆内存大小。
Xms设置JVM的初始堆内存大小。
Xmn设置新生代的大小。新生代包含Eden区和两个Survivor区
Xss设置每个线程的堆栈大小。
SurvivorRatio设置Eden区与Survivor区的大小比例。
MaxPermSize / MaxMetaspaceSize设置永久代(PermGen)或元空间(Metaspace)的最大大小。

六、JVM调优参数


所谓的JVM调优,就是为了保证我们系统的稳定运行

  1. 设置各个内存区域的大小和占比【五】
  2. 选定合适的垃圾回收器(基本都是用默认的)
  3. 当前系统关注的是快速回收还是吞吐量,基于此去设置 Parallel 和 G1的相关参数
  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值