判断java虚拟机内存里的对象已死两种方式

来源:互联网 发布:彩票中奖的人 知乎 编辑:程序博客网 时间:2024/06/07 15:24


第一种:引用计数饭:给对象添加一个引用计数器,每当有一个地方需要引用它的时候  ,计数器的值就加1,否则就减1,计数器的值为0的时候,就说明对象已死

缺点:如果该对象被外一个引用指着,前一个引用永远不会再被利用了,但是她的计数器不为零,则那个对象永远不会被认为死掉,

实际上,虚拟机还是会回收他们的,所以,虚拟机不是用这种方式回收他们的,

第二种:根搜索算法:通过一系列的名为“gc roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过 的路径称之为引用连(reference chain),当一个对象到gc roots

没有任何引用链相连(用图论的话来说就是从Gc Roots到这个对象不可达)时,证明这个对象是不可用的,辉判断为可回收对象,但不会立即回收,它还有一次机会

如果对象在进行跟搜索后发现没有与GC roots,相连接的引用链,那他将会被第一次标记并且进行一次筛选,判断有没有必要进行回收:筛选的条件是此对象有没有必要执行finalize():如果对象没有覆盖finalize()方法,或者已经被虚拟机调用过,则java虚拟机将这两种情况视为没必要执行;如果被判定执行finalize()方法,就会被放到一个

F-Queue队列之中,并在稍后有虚拟机自动建立一个低优先级的Finalizer线程去执行,这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果一个对象在finalize()方法中执行缓慢,或则发生了死循环,将很可能导致F-queue队列中的其它对象永久处于等待状态,甚至导致整个内存回收系统崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后gc将对F-queue中对象进行二次标记,他们就会死掉,即被回收

finalize()的方法,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作(如关闭流等操作)。但JVM(Java虚拟机)不保证此方法总被调用。

1 0
原创粉丝点击