jvm垃圾回收

来源:互联网 发布:linux dd bs 编辑:程序博客网 时间:2024/04/30 04:19

           怎么判断对象是否存活呢?

           只要有两种算法:

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

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

                  永远不会被回收。

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

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

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

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

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

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

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

         的命运呢。

0 0