JVM(二) 四种GC算法,以及GC日志分析理解

1 四种GC垃圾回收算法(Hotspot)

1.1 引用计数法

在这里插入图片描述
引用计数法,是通过引用计数器,来维护每个对象被引用的次数,如果被引用次数为0 则允许被垃圾回收。对象每新增一个被引用则引用计数器++,减少则–。

缺点:
没有办法解决循环引用的问题,比如A-B, B->A 则永远不会被垃圾回收。现在已经不怎么使用了

GCRoot

标记算法我们可以了解为一个可达性算法,所以所有的可达性算法都会有起点,那么这个起点就是GC Root,也就是需要通过GC Root 找出所有活的对象,那么剩下所有的没有标记的对象就是需要回收的对象。

GCRoot 在哪里

  • 所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。
  • VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。

1.2 复制

复制算法主要应用于Yong代。
Hotspot JVM 吧年轻代分了三部分,1个Eden区和1个From区1个To区,比例8:1:1
原理:
从跟集合GC ROOT 开始,通过Tracing 从From 钟找到存货对象,拷贝到To中,From,To交换身份,下次内存分配从To开始。
优点:没碎片
缺点: 耗空间,To区域要始终为空准备接受,从From区域复制来的数据
在这里插入图片描述
Eden区对象存活率低,一般的,使用两块10%的内存作为空闲和活动区间,而另外80%的内存,则用来给新建对象分配内存的。一旦发生GC,将10%的from活动区间与另外的80%中存活的eden对象转移到10%的to空闲区间,接下来将之前90%的内存全部释放。以此类推。

1.3 标记清除

主要用在Old区域
在这里插入图片描述
先标记,再清除
优点: 节约空间
缺点: 产生碎片,两次扫描(标记+清除)耗时

1.4 标记压缩

在这里插入图片描述
对比于标记清除,会再多一步,压缩,将不连续的对象,重新编排,使之连续,整理出连续的内存区域。
优点:没有碎片,节约空间
缺点:效率低,比复制算法慢

2 GC 日志分析

通过在启动参数中添加

-XX:+PrintGCDetails

开启详细的GC日志。
GC 日志主要有以下两类

yongGC

在这里插入图片描述

FullGC

在这里插入图片描述

YongGC(Minor GC) 和FullGC(MajorGC)区别

在jvm进行垃圾回收的时候,并非每次都对,年轻代,老年代,元空间三个区域同时进行回收。YongGC 只发生在年轻代区域,FullGC 为全局GC 发生在三个区域都会发生。

  • Minor GC: 发生在新生4,pingfan代区域的垃圾回收。通常java 对象存活率不高,所以yongGC 会比较频繁,速度也比较快
  • Major GC : 全局GC ,指的是发生在老年代的GC垃圾回收,通常都会先一次或者多次MinorGC 之后,内存空间仍然不足,才会触发Full GC, Full GC 速度一般比 Minor GC 速度慢10倍以上。在FullGC 之后仍然没有太多可用空间,则会抛出OOM

HotSpot虚拟机GC 主要有以下特点

  • 次数上频繁收集Young区
  • 次数上较少收集Old区
  • 基本不动元空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值