For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
垃圾回收机制在许多软件编程开发项目中都是经常用到的一个编程技术,下面我们就通过案例分析来了解一下,垃圾回收对象存活判断方式分享。
1、引用计数算法
在对象中添加一个引用计数器,每当有一个地方引用它时计数器就加1,当引用失效时计数器减1。当计数器为0的时候,表示当前对象可以被回收。
这种方法的原理很简单,判断起来也很高效,但是存在两个问题:
堆中对象每一次被引用和引用清除时,都需要进行计数器的加减法操作,会带来性能损耗
当两个对象相互引用时,计数器永远不会0。也就是说,即使这两个对象不再被程序使用,仍然没有办法被回收。
2、可达性分析算法
可达性分析算法是jvm默认使用的寻找垃圾的算法,需要注意的是,虽然说的是寻找垃圾,但实际上可达性分析算法寻找的是仍然存活的对象。至于这样设计的理由,是因为如果直接寻找没有被引用的垃圾对象,实现起来相对复杂、耗时也会比较长,反过来标记存活的对象会更加省时。
可达性分析算法的基本思路就是,以一系列被称为GCRoots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连时,证明该对象不再存活,可以作为垃圾被回收。
在java中,可作为GCRoots的对象有以下几种:
在虚拟机栈(栈帧的本地变量表)中引用的对象
在方法区中静态属性引用的对象
在方法区中常量引用的对象
在本地方法栈中JNI(native方法)引用的对象
jvm内部的引用,如基本数据类型对应的Class对象、一些常驻异常对象等,及系统类加载器
被同步锁synchronized持有的对象引用
反映jvm内部情况的JMXBean、JVMTI中注册的回调本地代码缓存等
此外还有一些临时性的GCRoots,这是因为垃圾收集大多采用分代收集和局部回收,考虑到跨代或跨区域引用的对象时,就需要将这部分关联的对象也添加到GCRoots中以确保准确性。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。