第三章 垃圾收集器与内存分配策略

2017-03-09  本文已影响0人  码农也越野

对象存活判定算法

引用计数算法

原理是每个对象都有一个引用计数器,当被引用时,计数器加1,取消引用时计数器减1。计数器为0时表明该对象不再被其他对象引用,就可以回收。
弊端是当出现循环引用时无法回收,导致内存泄露。

可达性分析算法

原理是通过一系列成为GC ROOTS的对象作为根节点,开始向下搜索,所走过的路径成为引用链,当一个对象通过任何引用链都不可达时,这个对象就会被回收。
可以作为GC roots的对象包括:

JAVA中的引用

对象的自我救赎

当对象在可达性分析算法中通过任何引用链都不可达时,该对象也不会立即被回收。只是相当于被判死缓。真正执行死刑分两次标记阶段:当对象不可达时,被第一次标记并且筛选,看该对象是否有必要执行finalize方法。如果该对象没有覆盖finalize方法或者该对象的finalize方法已经被执行过,则该对象就没有必要执行finalize方法。如果该对象被判定为有必要执行finalize方法,那么这个对象将被放入一个叫做F-Queue的队列中,然后由一个虚拟机自动建立的低优先级的finalizer线程去执行。所谓的执行只代表触发这个方法,并不会等待方法执行结束,这是因为如果一个对象在finalize方法中执行缓慢或者出现死循环,则这个线程将会被阻塞,F-Queue中的其他对象永远处于等待中,整个内存回收系统会崩溃。finalize才能决定该对象最后的命运。如果在finalize方法中重新与引用链 中 的对象建立关联,譬如把自己赋值给某个类变量或者对象的成员变量,在第二次标记时该对象将被从F-Queue队列中移除。剩下的对象将被真的回收。但是如果被移除的对象又一次被判死刑,则finalize方法也拯救不了它了,因为finalize方法只会被执行一次。(这就好比一个女人被判了死刑,但是执行死刑前发现该犯人怀孕了,那就不会被执行死刑了。但是这免死金牌只能用一次。)

垃圾收集算法

垃圾收集器

内存分配与回收策略

上一篇下一篇

猜你喜欢

热点阅读