jvm的垃圾回收过程讲解,什么时候对什么东西做了什么事

版权声明:转载请注明出处 https://blog.csdn.net/h2604396739/article/details/87371666

了解java虚拟机堆内存的分配策略

堆内存: 新生代(1个eden+2个survior)+老生代
New的对象首先进入eden中,经历一次minorGC后,如果对象还在则进入survior区域;其后每经过一次minorGC则会存活次数增加一个,到达一定的程度后进入老生代块中;
minorGC:对新生代堆块进行垃圾回收,因为此时大多数的对象都是朝生夕死,所以使用复制算法;
fullGC:对老生代区回收,因为死去的对象较少,所以使用标记整理算法.

新生代中为甚是两个survior

理解新生代的1个eden和2个survior,为什么是两个survior?假设两个survior分别是s1和s2
那么第一次minorGC:s1和s2都是空的,eden中有值,gc时eden中的存活对象会复制到s1;第二次gc,此时eden中的存活对象复制到s2,这些对象年龄统一为1,然后s1中的存活对象会将年龄加1,然后判断年龄是否足够大,足够大的进入老生代,别的进入s2,并且清空s1和eden;随后的gc与第二次gc相似;
从上面能够看出,eden和survior在minorGC时操作存在不同。

触发GC时机(什么时候)

minorGC触发:eden已满或者新建的对象已经没有空间可存
fullGC:minorGC之前,比较survior区域对象的大小和老生代剩余连续内存的大小,如果fullGC剩余连续空间小于survior区域对象,会查询HandlePromotionFailure设置是否允许担保失败,如果不允许则直接进行进行fullGC,否则继续比较老生代剩余连续内存空间和历次晋升到老年代去的对象的平均大小,如果小于,则进行fullGC,否则尝试minorGC,如果失败也会fullGC;

被GC的对象(对什么东西)

如果对象到GC ROOTS 没有连接链,则该对象为不可达对象,应该被GC回收.

GC过程(做了什么事)

MinorGC:使用复制算法,清除新生代中的不可达对象.一个eden区域,两个survivor区域,仅使用eden和一个survior区域,minorGC时,把eden和已使用survior存活对象放入另一个survior中,然后清理刚刚使用的eden和survior
FullGC:清理整个堆空间包括新生代和老年代,老年代使用标记整理算法,清除老生代中的不可达对象.

猜你喜欢

转载自blog.csdn.net/h2604396739/article/details/87371666