垃圾回收器如何肯定哪些对象要回收:
引用计数法java
不少教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当有一个地发引用它时,计数器值就加1;当引用失效时,计数器值就减1;任什么时候刻计数器都为0的对象就是不可能再被使用的。算法
客观地说,引用技术算法的实现简单,断定效率也很高,在大部分状况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM技术、使用ActionScript 3 的FlashPlayer、Python语言以及在游戏脚本领域中被普遍应用的Squirrel中都使用了引用计数算法进行内存管理。可是java语言中没有选用,其中最主要的缘由是它很难解决对象之间的相互循环引用的问题。c#
根搜索算法ui
在主流的商用程序语言中(java和c#),都是使用根搜索算法(GC Roots Tracing)判断对象是否存活的。这个算法的基本思路就是经过一系列的名为“GC Roots”的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来讲就是从GC Roots到这个对象不可达)时,则证实此对象是不可用的。 spa
在java语言里可做为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中的引用对象。对象
方法区中的类静态属性引用的对象。游戏
方法区中的常量引用的对象。ip
本地方法栈中JNI(即Native方法)的引用的对象。
内存