博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
阅读量:6518 次
发布时间:2019-06-24

本文共 1033 字,大约阅读时间需要 3 分钟。

①首先说一下,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 分区

转载地址:http://nnrfo.baihongyu.com/

你可能感兴趣的文章
1711: [Usaco2007 Open]Dingin吃饭
查看>>
Anti-debugging Skills in APK
查看>>
BJFU-ACM 12月8日月赛官方题解
查看>>
<HTTP权威指南>记录 ---- 网络爬虫
查看>>
[leetcode] 242. valid anagram
查看>>
Welcome to my blog
查看>>
SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
查看>>
grub密码
查看>>
menuStrip之MdiWindowListItem判断子窗口是否被打开的方法
查看>>
Tree树 递归查询,显示成JSON格式
查看>>
Vs2019 C# .net core 将证书添加到受信任的根证书存储失败,出现以下错误:访问控制列表(ACL)结构无效...
查看>>
Java添加快捷键
查看>>
Freebsd10.3(FreeBSD11 Beta1)使用手记
查看>>
Oracle 数据类型
查看>>
【算法学习笔记】88.显式DFS SJTU OJ 2202. 梅西的过人
查看>>
django之Form表单
查看>>
定时任务调度框架实现总结
查看>>
Git 学习笔记
查看>>
jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
查看>>
洛谷P3390 【模板】矩阵快速幂
查看>>