【JVM】6_GC存活分析算法之引用计数法的优缺
来源:互联网 发布:思源物业软件 编辑:程序博客网 时间:2024/06/05 18:30
引用计数法(Reference Counting)的含义:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
优点:客观地说,引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软公司的COM(Component Object Model)技术、使用ActionScript 3的FlashPlayer、Python语言和在游戏脚本领域被广泛应用的Squirrel中都使用了引用计数算法进行内存管理。
缺点:主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。
/** * VM参数 : -XX:+PrintGC (用来输出GC日志) * 或者 -XX:+PrintGCDetails 来输出详细日志 */public class Main { public static void main(String[] args) { TestObj t1 = new TestObj(); TestObj t2 = new TestObj(); //对象间相互引用 t1.refObj = t2; t2.refObj = t1; //引用指向空 t1 = null; t2 = null; //立即执行GC回收 System.gc(); }}class TestObj { private static final int _1MB = 1024 * 1024; /** * 这个成员属性的唯一意义就是占点内存,以便在能在GC日志中看清楚是否有回收过 */ private byte[] bigSize = new byte[4 * _1MB]; public TestObj refObj = null;}
输出的GC日志:
[GC (System.gc()) 14700K->848K(249344K), 0.0007753 secs][Full GC (System.gc()) 848K->636K(249344K), 0.0045591 secs]14700K->848K可以看出t1和t2所引用的对象已被回收了,而两个对象之间是相互引用的,虚拟机并没有因为这两个对象互相引用就不回收它们,这也从侧面说明虚拟机并不是通过引用计数算法来判断对象是否存活的。
阅读全文
0 0
- 【JVM】6_GC存活分析算法之引用计数法的优缺
- Java对象是否存活之引用计数算法&可达性分析算法
- JVM之对象存活的算法
- 由JVM引发的思考_GC算法与种类
- java 对象存活分析——引用计数法&可达性分析
- JVM垃圾回收之引用计数法
- jvm-判断对象是否存活的算法
- 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
- 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
- jvm垃圾回收机制之可达性算法与引用计数算法
- jvm对象存活判定算法
- JVM高级特性与实践(二):对象存活判定算法(引用) 与 回收
- JVM高级特性与实践(二):对象存活判定算法(引用) 与 回收
- JVM高级特性与实践(二):对象存活判定算法(引用) 与 回收
- JVM实用参数_GC日志
- Cocos2dx内存管理之引用计数分析
- JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
- Java虚拟机使用引用计数来确定对象是否存活?
- 文章标题
- EM算法
- Apple Pay开发 申请MerchantID详细介绍
- 20行python代码——爬取知乎神回复
- luogu P2258 子矩阵
- 【JVM】6_GC存活分析算法之引用计数法的优缺
- 二叉树的基本操作
- git下载github分支代码的部分文件
- 在 springMVC 项目中,获取文件并上传
- 洛谷1613 跑路【倍增+floyd】
- 如何解决:无法导入密钥文件“XXX.pfx”。密钥文件可能受密码保护。
- 有return的情况下try catch finally的执行顺序
- HTML5语义元素
- oracle数据库基本操作