JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制


①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是“根”的一个,根还包含方法中的成员变量。仅仅有成员或对象不挂在根上,GC的时候就可能把他们搞掉,这里提到的循环引用,就看这个循环引用是否挂在根上,假设挂在根上。假设这个根还被JVM的Java代码所运行的话,就不会GC掉,假设说这个根已经被释放掉了。这个对象不挂在跟上了。那个这个对象就会被GC掉。


②说一下根搜索算法,ROOTS,这个算法,那些在Java里会被觉得是根呢,在我印象里通常是static修饰的类成员,比方说静态字段,这样的字段引用的对象被称为根。仅仅要类在POOL区里不被卸载。一直在堆里,类对象仅仅要没被回收掉,他引用的对象就不会被GC。


③再说还有一种情况。方法中的栈,栈中有他的栈成员 Integer  a = XXX,当方法没有被释放。没有出栈的时候,方法没有被弹出的时候,那Integer a 所引用的对象也是不会被回收的,在什么情况下回收呢,就是这个对象没有挂在根上。就会被回收。


④我们回到标题的问题,这个循环引用是否被回收,就看这个循环引用是否挂在根上,A引用B,B引用A,A和B并没有挂在某个内存元和根上,当他们的生命周期结束的时候。这两个对象都有可能被回收。


⑥详细回收的机制,就比較复杂了。每次GC的时候。对要被回收的对象标记一次。比方说会有个计数器每次+1,+1,+1。每次GC的时候就+1一次。当对象达到默认值了。比方说好像15次吧,在新生带创建的对象达到15次了就会被达到老年带里去,而老年代对象的回收的频率和新生带回收的频率是不一样的,能够细致看下图中pool里的分区。了解他们的执行机制。




注:JVM heap分区块

Generation代
 - YongGeneration/NewGeneration:新生代。在Eden/S0/S1的存活的对象。

 - OldGeneration:老年代。在Tenured区存活的对象。
 - PermanentGeneration:永久代。
Space 区
 - Eden:伊甸园区。是新生代的一个区。


 - Survivor:幸存区,属于新生代,为了复制算法的须要。一般分成大小相等的两个区(S0/S1或者From/To)。

 - Tenured:存放老年代的区域。
 - Permanent:终身区。



 
下图:Hotspot 的 Heap 分区

转载于:https://www.cnblogs.com/zhchoutai/p/6784929.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值