开发学习笔记-GC

GC学习笔记Garbage Collection

1.GC介绍
程序运行的内存空间是有限的,需要在运行时及时的将不使用的内存空间清理释放出来,即Garbage Collection
需要GC的内存区域有:java堆内存和方法区内存,主要针对无用堆实例对象的回收,常量池的回收和类型的卸载
(程序计数器,虚拟机栈,本地方法栈都随着线程而生随线程而灭,栈中数据随着方法的进入和退出而自动清理)
触发GC:
1.程序调用System.gc
2.系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定,当不足时启动GC线程)

2.GC Roots有哪些
需要GC的对象就是已经没有存活的对象,判断一个对象是否存活有两种放过发:引用计数和可达分析
引用计数:每个对象有一个引用计数属性,新增一个引用则计数+1,释放一个引用则计数-1,计数为0时可以回收,此方法不能解决对象的相互引用问题
可达性分析:从GC Roots开始向下搜索,搜索走过的路径称位引用链。当一个对象到GC Roots没有任何引用链时,可以回收
GC Roots 包括:
虚拟机栈中引用的对象
方法区中类静态属性实体引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象(什么是本地方法栈和JNI?)
3.GC 算法
标记-清除(整理) 算法
为每个对象存储一个标记位,记录对象的状态(活着/死亡)。分为标记阶段和清除阶段
标记阶段:为每个对象更新标记位,检查是否死亡
清除阶段:清除死亡的对象,执行GC操作
标记方法:遍历每个对象,对于一个对象,只要找到一个引用,就存活,否则死亡
优点:算法不移动对象的位置
缺点:效率低,在标记阶段和清除阶段都要遍历所有对象一遍
会产生大量碎片空间
标记-压缩 算法
标记-清除算法的改进版,标记阶段相同,在第二个阶段,不是直接清理所有死亡对象,而是整理存活对象,将所有活着的对象整理放到另一处空间,然后将
将剩下所有对象清除。

	优点: 不会产生大量碎片空间
	缺点: 如果存活对象过多,整理阶段会执行较多复制操作,效率低
		   效率低,在标记阶段和整理阶段都要遍历所有对象一遍
复制算法
	将内存区域平均分成两部分,每次只使用其中一部分,当这部分内存满了后,将所有存活对象复制到另一个内存中,然后清空之前的内存,只使用当前内存,如此循环
	与标记-整理算法的不同在于,不是在同一个区域复制对象,而是将存活对象复制到另一个区域中

	优点: 实现简单,不产生内存碎片
	缺点: 只能使用一半内存
分代收集算法(主流算法)
	根据对象的生存周期,将堆分为新生代(Young)和老年代(Tenure)。在新生代中,对象生存期短,每次回收都有大量对象死去,采用复制算法。
												在老年代中,对象存活率高,没有额外的空间进行分配担保,使用标记-清除或标记-整理算法
	新生代GC过程:
		新生代分为Eden区,From区和To区
		第一次GC:系统在Eden区创建对象,当Eden区满了后,触发依次YoungGC,将能用的对象复制到From区,此时Eden区为空,创建对象依然在Eden区
		第二次GC:当Eden区再次被填满,再触发YoungGC,此时将Eden区和From区存活的对象复制到To区
		第三次GC:当再次触发YoungGC,将Eden区和To区的存活对象复制到From区
		如此循环.....
		当某些对象在多次GC后依然存活,则将对象放入老年代
	老年代空间用完后进行Full GC,全量回收
	Full GC消耗资源大,频繁使用会对性能产生影响,需要合理设置新生代和老年代的大小,尽量减少Full GC操作

4.垃圾收集器
用于实际GC的具体实现
1.Serial收集器
串行收集器,最稳定,效率高
但由于是串行,只使用一个线程回收,可能会产生较长时间的停顿
2.并行收集器
2.1ParNew
新生代并行
多线程回收,复制算法
老年代串行
2.2Parallel
类似ParNew
新生代复制算法,老年代标记-压缩,老年代可以选择并行或串行
3.CMS收集器
Concurrent Mark Sweep 并发标记清除(应用程序线程和GC线程交替执行)
CMS是老年代收集器,新生代使用ParNew
使用标记-清除算法
具体实现:
1.初始标记(stop the world)
先标记所有GC Roots可以直接关联到的对象,速度快
2.并发标记
并发的标记全部对象,用户程序在此时并发执行
3.重新标记(stop the world)
修正并发标记时可能有标记不正确的对象,例如在并发标记时仍然存活,但是此时死亡的对象
只对所有标记为存活的对象进行修正
4.并发清除
基于标记结果,清理对象,此时用户程序可以正常执行
优点:并发收集,停顿时间短
缺点:对CPU资源敏感
无法处理浮动垃圾(在重新标记后,程序仍在并发执行,在这个阶段变为垃圾的对象,称为浮动垃圾)
产生大量空间碎片,分配大对象时可能会因为无法找到连续空间而提前触发Full GC
4.G1收集器
目前最优
与CMS相比的优点:
1.空间整合,采用标记-整理算法,不会产生内存空间碎片
2.可预测停顿
3.不牺牲大量的吞吐量性能
总结:
1.G1把内存分成一块块的region,每块region大小相同
2.G1保留了Young Garbage Collection(YGC)并加上了一种MIXGC用于收集老年代。G1中没有Full GC,G1中的
Full GC采用serial old full GC。在MIXGC中,Cset是选定所有新生代的region,并加上根据全局并发标记
统计得出的收益最高的若干老年代region。通过控制选定的region的个数来控制开销
3.G1低延迟的原因在于精确控制回收的区域和范围,根据用户指定的时间来计算出收益最大的区域,并回收这些区域
4.使用STAB来维持并发GC的准确性
STAB:只要在扫描中发现对象是活的,那在整个GC过程中都认为是活的,保证了GC的都是垃圾,但会产生浮动垃圾(是死的,却没被回收)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值