您的位置:首页 > 编程语言 > Java开发

java虚拟机中如何判断对象已经可以garbage collected

2014-07-28 22:19 267 查看
3.java虚拟机中如何判断对象已经可以garbage collected。(引申:如何对链表求环)

对象是否存活的算法一般有两种:引用计数算法(java中没有选用此方法来管理内存,最主要的原因是它很难解决对象之间的相互循环引用的问题)和根搜索算法。

根搜索算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这个节点开始向下搜索,搜索所有走过的路径称为引用链,当一个对象到GCRoots 没有任何引用链相连时,就证明次对象不可用的。不可达的对象,暂时处于“缓刑”阶段,宣告一个对象真正死亡,至少经历两次标记过程:1.如果对象在进行根搜索后发现没有与GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。2.如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue中的队列之中,并在稍后由一条虚拟机自动建立的、低优先级的Finalizer
线程去执行。finalize()是对象逃脱死亡的最后机会,稍后GC将对F-Queue 中的对象进行第二次小规模的标记,如果对象要在finalize() 中挽救自己——只要重新与引用链上的任何对象建立联系即可。那在第二次标记时它被移除出“即将回收”的集合。 在java语言里,可以作为GC Roots的对象包括以下几种: A. 栈中的引用的对象。
B. 方法区中的类静态属性引用的对象。 C. 方法区中的常量引用的对象。

D. 本地方法栈中JNI-Java Native Interface(一般说的是Native方法)的引用的对象。

如何对链表求环:两个指针移动方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐