垃圾回收算法
2018-05-08 10:28:44 1 举报
java垃圾回收算法
作者其他创作
大纲/内容
FullGC
Sweeping并发清理
缺点:1、标记和清楚的效率都很慢2、回收都的内存不连续,内存碎片多,分配较大内存时可能找不到可用的连续内存进而触发GC
Eden区+S From区内存占满时触发Eden+S From区 清理的垃圾大于S TO区时需要Old区进行内存担保。
1.8之前
初始化标记 InitalMarking
晋升成功?
1、该阶段是GC线程和用户线程并发执行的,期间不断产生和销毁对象,不断有新的对象进入old区,对象间的引用关系不断发生变化,需要重新进行标记,防止出现漏标的情况。2、为了提高重新标记的效率,该阶段会把上述对象所在的Card标识为Dirty,后续只需扫描这些Dirty Card的对象,避免扫描整个老年代。3、但是这里也会出现问题,因为的并发处理的有些对象时出现的标记之后,这些对象无法在本次GC中处理,只能等到下次GC进行处理,这部分垃圾被称为浮动垃圾(Floating Garbage)。
CMS
标记-清楚算法(使用期改良算法)
FinalMarking重新标记
标记-整理算法(CMS收集器)
有风险的MajorGC
PrecleaningAbortablePreclean预处理
方法区
minorGC触发条件
本地方法栈
S2(1)
优点:1、内存连续,简单高效缺点:1、可用内存降低为50%(新生代将其进行改良)
Eden(8)
Old区内存占用达设置的上线时触发Old进行内存担保失败时触发
E+S F S T
1、并发标记阶段(主要标记的是老年代中的引用关系)中标记完成后又重新产生的垃圾,这里要进行重新标记。可能产生新的引用关系如下:老年代的新对象被GC Roots引用老年代的未标记对象被新生代对象引用老年代已标记的对象增加新引用指向老年代其它对象新生代对象指向老年代引用被删除也许还有其它情况..2、要进行的可达性操作有遍历新生代对象,重新标记根据GC Roots,重新标记遍历老年代的Dirty Card,重新标记,这里的Dirty Card大部分已经在clean阶段处理过
并发标记 Markding
Y
Old最大连续可用空间历次晋升到Old区对象的平均打下
Heap
CG
周期性Old GC(BackgroundCollect)
MinorGC
虚拟机栈
主动Old GC(BackgroundCollect)
复制回收算法
调用system.gc时,建议系统进行CG,但是不一定会执行。Old区内存不足永久带或者mateSpace内存不足时Old进行内存担保失败时触发通过Minor GC后进入老年代的平均大小大于老年代的可用内存
MateSpace
Resetting重置
majorGC触发条件
演变
结束
Resizing重新调整堆大小
老年代(major)
该阶段单线程执行,主要分分为两步:1、标记GC Roots可达的老年代对象;(内部使用一个OopMap来记录对象的偏移量,可直接获取不用重新挨个遍历可达)2、遍历新生代对象,标记可达的老年代对象;(新生代中的对象有指针指向老年代的对象时,对象不可清除)
lding等待
Markding并发标记
JVM运行时数据区
CMS(ConcurrentMarkSweep)收集器
将可用内存分成1:1的两块,,每次使用的时候只使用其中的一块。垃圾回收的时候将存活的对象复制到另一份备用内存中。然后清理当前内存。
fullGC触发条件
周期性GC主要是有ConcurrentMarkSweepThread去默认触发的(默认2s一次)触发条件:1.如果没有设置 UseCMSInitiatingOccupancyOnly,虚拟机会根据收集的数据决定是否触发(线上环境建议带上这个参数,不然会加大问题排查的难度)2.老年代使用率达到阈值 CMSInitiatingOccupancyFraction,默认92%3.永久代的使用率达到阈值 CMSInitiatingPermOccupancyFraction,默认92%,前提是开启 CMSClassUnloadingEnabled4.新生代的晋升担保失败(复制回收超过10%,old区的分配担保)
HandlePromotionFailure是否允许担保失败
并发重新标记 FinalMarking
S1(1)
N
标记-整理对标记-清理进行优化,不只是单单的清理标记的对象,而是将存活的对象向一段移动,然后清理边缘地区的区域。
内存担保
1.8之后
优点:1.内存连续缺点:1、存活的对象少切分散时移动和清楚效率较慢,适用已大量对象存的的情况
复制回收算法(新生代使用算法)
InitalMarking初始化标记
周期性oldGC主要是线程去执行的,和垃圾回收情况有关,但是主动GC是CMS主动发起的发生5条件promotion failed(新生代回收minorGC的时候Eden+S From区的空间大于S TO区 对象进入Old区 空间不足)concurrent mode failure(Old去是使用标记-清除算法浮动垃圾太多,内存高度碎片化,达到一定程度)
变更部分
Old最大连续可用空间E+S F
程序计数器
新生代(minorGC)
新生代中Eden和S0、S1的内存比例为8:1:1,分配内存的时候只分配Eden和其中一个S区,也就是没次新生代可用的内存为(80%+10%)90%,剩余的10%作为复制的备用区域,当要回收的对象超过10%,通过分配担保将对象分配到老年代。
之前讲的可达性分析算法将内存中的对象进行标示,对不同标记的对象进行不同程度的回收(强应用:不进行回收,软引用:内存充足是不进行回收,内存不足时进行回收,弱引用:GC的时候都会进行回收)
1.what: 收集器是具体执行垃圾回收算法的。CMS是一款适用标记-清除算法的收集器,如果Old代适用CMS垃圾回收器需要添加参数“XX:+UseConcMarkSweepGC”2.why : CMS是一种以获取的最短回收停顿时间为目标的收集器 ,适用于对时延要求高的服务3 .缺点 : 因为适用的是标记-清楚算法,所以长时间运行的时候产生很多内存碎片(不连续的内存地址),当内存碎片太多不满足要求是会触发fullGC(持续时间较长)。4.实现机制:根据GC的触发机制分为:周期性Old GC(被动触发)和主动Old GC.
永生代
0 条评论
下一页