You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
G1 Yong GC
Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。在这种情况下,Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老代空间。Survivor区的数据移动到新的Survivor区中,也有部分数据晋升到老年代空间中。最终Eden空间的数据为空,GC停止工作,应用线程继续执行。
Young GC是如何快速定位无用对象,并复制清理的呢?
首先GC Roots来源于常量,静态变量以及虚拟机栈、本地方法栈中的引用对象。
OopMap设计通过统计线程栈的引用对象,所以我们可以快速获取GC Roots。
1.回收算法
标记清除
复制清理
标记整理
2.垃圾回收器
Serial Young
ParNew
Scavenge
Serial Old
Parallel Old
CMS
3.G1垃圾回收器
G1垃圾回收器将JVM内存区域从分代的若干个完整区域,分成分代的一个一个小的Region,1-32M不等,可已指定大小。由于使用的是复制清理的算法,在回收过程中将待回收Region中的存活对象拷贝到空闲Region中,再清理待回收的Region,所以相对CMS,它是一个低停顿,分代的垃圾回收器,同时内存碎片率大大减小。
G1垃圾回收器的内存模型
![g1](https://user-images.githubusercontent.com/32005768/49416807-d8ad3e00-f740-11e8-857a-6dc2c5fd1d56.png)
Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。在这种情况下,Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老代空间。Survivor区的数据移动到新的Survivor区中,也有部分数据晋升到老年代空间中。最终Eden空间的数据为空,GC停止工作,应用线程继续执行。
Young GC是如何快速定位无用对象,并复制清理的呢?
首先GC Roots来源于常量,静态变量以及虚拟机栈、本地方法栈中的引用对象。
OopMap设计通过统计线程栈的引用对象,所以我们可以快速获取GC Roots。
Young GC只回收Eden区域的内存,因此在做可达性分析时,使用整个GC Roots效果不佳,因为GC Roots中包含了大量Old区域的对象。但是由于确实存在某些Old区域的对象引用了Eden区域的对象,因此将GC Roots的Eden区域对象作为扫描范围,会有问题。所以为了缩小可达性分析的范围,需要一些辅助的集合协助我们。
G1的内存模型中每个Region都会包含一个Remebered Set,此集合保存了所有其他Region引用本Region对象的信息,实际上是一个Hash Table,key为其他区域的起始地址,value是个list,保存引用的对象在该Region下的位置(即Card Table的下标)。
通过RS,我们可以快速找到Young GC需要扫描的GC Roots范围:Young + RS中的对象。
Young GC 阶段:
阶段1:根扫描
静态和本地对象被扫描
阶段2:更新RS
处理dirty card队列更新RS
阶段3:处理RS
检测从年老代指向年青代的对象
阶段4:对象拷贝
拷贝存活的对象到survivor/old区域
阶段5:处理引用队列
软引用,弱引用,虚引用处理
The text was updated successfully, but these errors were encountered: