JVM性能调优系列【二】垃圾回收GC调优原理

垃圾回收机制

概念

垃圾回收分类:

  • 对象回收:发生在堆内存空间中,也是jvm中最大的一块区域。
  • 方法回收:方法的回收其实就是类卸载。类卸载的条件:所有引用,以及对应的类加载器都为null。要想观察类卸载的过程,可以再启动参数中加入-verbose.class

在对象的回收中主要有两个概念,那就是什么是垃圾。主要有两种方式去判断,在jvm中实现的是第二种(因为第一种可能存在循环依赖导致垃圾无法回收)。

方式一:引用计数算法​

就是对每一个创建的对象在其对象头都会有一片空间保存着一个计数器,用于记录被引用的次数,当计数器的值为 0 的时候就表示该对象可以被回收了。

方式二:可达性分析

但是对于那些类似于连个对象相互引用的情况来说,这种引用计数的方式就没法回收他了。因此需要通过可达性分析的方式判断是否为垃圾。通过一些被称为引用链的方式向下搜索,搜索走过的路径当一个对象到 GC Roots 没有任何引用链相连时,则证明该对象是不可用的。

在这里插入图片描述
哪些是GC Roots

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
    引用类型
  • 强引用:最常见,比如new一个对象,不会回收。
  • 软引用:jvm认为内存不足时会试图去回收它。(缓存场景)
  • 弱引用:随时可能被回
  • 虚引用:不能通过它访问对象,供对象被finalize以后,执行指定逻辑的机制(Cleaner)
    可达性级别
  • 强可达:一个对象可以通过一个或多个线程可以通过各种引用访问到的情况
  • 软可达:只能通过软引用才能访问
  • 弱可达:只能通过弱引用才能访问
  • 幻想可达:只能通过虚引用才能访问
  • 不可达: 没有任何引用

堆内存空间

堆内存分为新生代,老年代和永久代

  • jdk1.6之前:永久代,常量池在方法区
  • jdk1.7 :永久代,但是慢慢的退化了,去永久代,常量池在堆中
  • jdk1.8之后:无永久代,常量池存在元空间
    在这里插入图片描述
    内存空间大小占比默认:
    • 新生代:老年代 = 2:8
    • Eden:S0:S1 = 8:1:1

内存分配策略

Java提供的自动内存管理,可以归结为解决了对象的内存分配和回收的问题,前面已经介绍了内存回收,下面介绍几条最普遍的内存分配策略

  • 对象优先在Eden区分配 大多数情况下,对象在先新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Young GC
  • 大对象之间进入老年代 JVM提供了一个对象大小阈值参数(-XX:PretenureSizeThreshold,默认值为0,代表不管多大都是先在Eden中分配内存),大于参数设置的阈值值的对象直接在- - 老年代分配,这样可以避免对象在Eden及两个Survivor直接发生大内存复制
    长期存活的对象将进入老年代 对象每经历一次垃圾回收,且没被回收掉,它的年龄就增加1,大于年龄阈值参数(-XX:MaxTenuringThreshold,默认15)的对象,将晋升到老年代中
  • 空间分配担保 当进行Young GC之前,JVM需要预估:老年代是否能够容纳Young GC后新生代晋升到老年代的存活对象,以确定是否需要提前触发GC回收老年代空间,基于空间分配担保策略来计算:
  • continueSize:老年代最大可用连续空间

垃圾收集算法

轻GC(普通的GC)Minor GC

新生代内存的垃圾收集事件称为Young GC(又称Minor GC),当JVM无法为新对象分配在新生代内存空间时总会触发 Young GC,比如 Eden 区占满时。新对象分配频率越高, Young GC 的频率就越高。Young GC 每次都会引起全线停顿(Stop-The-World),暂停所有的应用线程,停顿时间相对老年代GC的造成的停顿,几乎可以忽略不计。

Old GC 、Full GC、Mixed GC

Old GC( MajorGC),只清理老年代空间的GC事件,只有CMS的并发收集是这个模式 Full GC,清理整个堆的GC事件,包括新生代、老年代、元空间等;Mixed GC,清理整个新生代以及部分老年代的GC,只有G1有这个模式。
有如下原因可能导致Full GC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显示调用
4.上一次GC之后Heap的各域分配策略动态变化
在这里插入图片描述

垃圾清除主要有以下三种算法:

标记清除法:将垃圾进行标记,然后将所有标记内容清除。两次扫描,会浪费时间,产生内存碎片;但是它不需要额外的空间;
标记压缩法
在标记清除的基础上再加了一层扫描,将清楚后的内存空间进行整理,解决的就是内存碎片的问题
复制算法
主要用于年轻代,比如将S0的内容全部复制到S1,然后全部清除S0的内容

GC调优目标

大多数情况下对 Java 程序进行GC调优, 主要关注两个目标:响应速度、吞吐量

  • 响应速度(Responsiveness) 响应速度指程序或系统对一个请求的响应有多迅速。比如,用户订单查询响应时间,对响应速度要求很高的系统,较大的停顿时间是不可接受的。调优的重点是在短的时间内快速响应
  • 吞吐量(Throughput) 吞吐量关注在一个特定时间段内应用系统的最大工作量,例如每小时批处理系统能完成的任务数量,在吞吐量方面优化的系统,较长的GC停顿时间也是可以接受的,因为高吞吐量应用更关心的是如何尽可能快地完成整个任务,不考虑快速响应用户请求
    GC调优中,GC导致的应用暂停时间影响系统响应速度,GC处理线程的CPU使用率影响系统吞吐量

垃圾收集器的选择,也多基于这两方面考虑。

垃圾收集器

1.Serial 串行收集器(单核,new+old)
用于单核处理器stop-the-world,单线程,停止等待垃圾回收的时间。client模式下jvm默认选项。分为新生代(复制算法)和老年代(标记整理算法)
响应时间优先
2、Parallel 并行收集器(new+old)
stop-the-world的停止时间依旧存在,只不过很短。server模式下jvm默认选项
分为新生代(复制算法)和老年代(标记-整理算法)
吞吐量优先,jvm默认
3、CMS 并发收集器(old)
CMS(Concurrent Mark and Swee 并发-标记-清除),是一款基于并发、使用标记清除算法的垃圾回收算法,只针对老年代进行垃圾回收。CMS收集器工作时,尽可能让GC线程和用户线程并发执行,以达到降低STW时间的目的。响应时间优先,(新版本中被废弃,建议使用G1)
在这里插入图片描述
4、ParNew 并行收集器(new)
实际上是Serial GC的多线程版本,可控制线程数量
新生代GC实现
响应时间优先
在这里插入图片描述
5、并发收集器(new/old)
g1将堆分为固定大小的区域,region之间是复制算法,但整体上实际可看做 标记-整理算法
兼顾吞吐量和响应时间。是一款面向服务器的垃圾收集器,支持新生代和老年代空间的垃圾收集,主要针对配备多核处理器及大容量内存的机器,G1最主要的设计目标是: 实现可预期及可配置的STW停顿时间
在这里插入图片描述

调优方法与思路

如何分析系统JVM GC运行状况及合理优化?

GC优化的核心思路在于:尽可能让对象在新生代中分配和回收,尽量避免过多对象进入老年代,导致对老年代频繁进行垃圾回收,同时给系统足够的内存减少新生代垃圾回收次数,进行系统分析和优化也是围绕着这个思路展开

1 分析系统的运行状况

系统每秒请求数、每个请求创建多少对象,占用多少内存
Young GC触发频率、对象进入老年代的速率
老年代占用内存、Full GC触发频率、Full GC触发的原因、长时间Full GC的原因
常用工具如下:

  • jstat jvm自带命令行工具,可用于统计内存分配速率、GC次数,GC耗时,常用命令格式
    jstat -gc <统计间隔时间> <统计次数>
    输出返回值代表含义如下:
    在这里插入图片描述
    例如: jstat -gc 32683 1000 10 ,统计pid=32683的进程,每秒统计1次,统计10次

jmap jvm自带命令行工具,可用于了解系统运行时的对象分布,常用命令格式如下

// 命令行输出类名、类数量数量,类占用内存大小,
// 按照类占用内存大小降序排列
jmap -histo <pid>

// 生成堆内存转储快照,在当前目录下导出dump.hrpof的二进制文件,
// 可以用eclipse的MAT图形化工具分析
jmap -dump:live,format=b,file=dump.hprof <pid>

jinfo 命令格式

jinfo <pid>

用来查看正在运行的 Java 应用程序的扩展参数,包括Java System属性和JVM命令行参数

其他GC工具:
监控告警系统:Zabbix、Prometheus、Open-Falcon
jdk自动实时内存监控工具:VisualVM
堆外内存监控: Java VisualVM安装Buffer Pools 插件、google perf工具、Java NMT(Native Memory Tracking)工具
GC日志分析:GCViewer、gceasy
GC参数检查和优化:http://xxfox.perfma.com/

参考文章:
1、https://www.yisu.com/zixun/598284.html
2、https://www.it610.com/article/1280578743185719296.htm
3、https://www.zhihu.com/question/57097660/answer/2202910213
4、https://www.yisu.com/zixun/464795.html
5、https://blog.csdn.net/weixin_45735355/article/details/121397268
6、https://blog.csdn.net/qq_44625080/article/details/124002598

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值