垃圾回收器如何肯定哪些对象要回收---《深刻理解java虚拟机》

垃圾回收器如何肯定哪些对象要回收:

  1. 引用计数法java

    不少教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当有一个地发引用它时,计数器值就加1;当引用失效时,计数器值就减1;任什么时候刻计数器都为0的对象就是不可能再被使用的。算法

    客观地说,引用技术算法的实现简单,断定效率也很高,在大部分状况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM技术、使用ActionScript 3 的FlashPlayer、Python语言以及在游戏脚本领域中被普遍应用的Squirrel中都使用了引用计数算法进行内存管理。可是java语言中没有选用,其中最主要的缘由是它很难解决对象之间的相互循环引用的问题c#

  1. 根搜索算法ui

    在主流的商用程序语言中(java和c#),都是使用根搜索算法(GC Roots Tracing)判断对象是否存活的。这个算法的基本思路就是经过一系列的名为“GC Roots”的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来讲就是从GC Roots到这个对象不可达)时,则证实此对象是不可用的。 spa

在java语言里可做为GC Roots的对象包括下面几种:

  • 虚拟机栈(栈帧中的本地变量表)中的引用对象。对象

  • 方法区中的类静态属性引用的对象。游戏

  • 方法区中的常量引用的对象。ip

  • 本地方法栈中JNI(即Native方法)的引用的对象。
    内存

相关文章
相关标签/搜索