您的位置:首页 > 其它

jvm垃圾回收

2015-06-27 13:00 260 查看
怎么判断对象是否存活呢?

只要有两种算法:

1,引用计数算法,给对象中添加一个引用计数器,每当一个有一个地方引用它时,计数器值+1,当引用失效,计数器-1。计数器为0时,说明对象不可能再被利用。

于是通知GC收集器,回收。这个算法思想很简单,但是存在问题,就是当两个对象互相持有对方的引用,而这两个对象在其他地方又没用处时,这两个对象将

永远不会被回收。

2,可达性分析算法,通过一系列“GC Roots”的对象作为起始点,开始向下搜索,搜索走过的路称为引用链,当一个对象到GC Roots没有任何引用链相连时,证明

该对象不可用。就可以判断为可回收对象。这一算法很好的解决了上面的问题。

但是,即使可达性分析算法中不可达的对象。也并非一定会被回收。

如果对象没有与GC Roots相连的引用链,他会被第一次标记,并筛选,筛选条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者已经被finalize()

方法掉用过,虚拟机视为没有必要执行。如果被视为有必要执行,这个对象就会被放到一个F-Queue队列中,并在稍后,由一个虚拟机自动建立的低优先级线程Finalizer

去执行。但不承诺等待该线程运行结束。原因是,如果一个对象在finalize()中执行缓慢,或者发生了死循环,将有可能会导致F-Queue队列中其他对象永久等待,甚至

怎个内存回收系统崩溃。稍后,GC将对F-Queue进行最后一次小规模标记,只要对象与引用链中的任何一个对象建立关联,那么第二次标记就会被移出。就逃脱了死亡

的命运呢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: