深入理解java虚拟机之第三章总结(1)

来源:互联网 发布:企业版软件报盘 编辑:程序博客网 时间:2024/05/18 00:22

第三章关于虚拟机内部的垃圾收集,在java虚拟机中对象的收集一般基于以下几种算法

①引用计数算法

最基础的一种对象收集算法,这种算法为对象添加一个引用计数器,每当有地方引用,计数器加一,引用失效计数器减去一,当计数器为0时对象不可用,但是他无法解决对象之间的循环引用,即两个类之间相互引用对方,这会导致虚拟机无法回收这类对象。

②可达性分析算法

在主流的程序语言一般使用可达性收集算法,通过可达性算法判断对象引用链是否可达,在jdk1.2之后对引用进行了扩充,细分为强引用,软引用,弱引用和虚引用。强引用比如用new 关键字定义的对象。软引用是指那些还有引用但并非必须的对象,在系统发生内存溢出之前会把将会把这些对象集中起来进行第二次回收,如果内存还不足将抛出内存溢出异常。弱引用也是指并非必须的对象,但是强度比软引用要弱,弱引用对象只能生存在下一次垃圾回收之前,当垃圾回收工作时,无论内存是否足够都要回收弱引用,虚引用也成幽灵引用是最弱的引用关系,一个对象是否有虚引用完全不会影响他的生存周期,虚引用的唯一目的是为了在这个对象被收集器收集时收到一个引用。如果一个对象是不可达的,那么并非对象就要被回收,如果对象覆盖了finalize()方法,或者对象的上方法需要被执行,那么对象会被烦那个岛一个F-Queue队列中,并在稍后有虚拟机建立的低优先级的Finalizer线程执行。从而运行对象的finalize()方法,但是并不会保证该方法被执行完成。

垃圾收集算法实现

对于虚拟机的可达性算法虚拟机主要有以下几种具体的实现算法

①标记-清除算法

算法分为标记和收集两个阶段:首先标记处要要收集的对象,标记完成后进行统一回收。但是该算法存在两个不足,一个是效率为另一个是空间问题,标记收集完成后会产生大量内存碎片

②复制算法

复制算法是按内存大小将内存划分为等大小的两块,每次只用其中的一块,当一块内存用完后,将存活的对象复制另一块,然后将剩这块进行回收这样就不用考虑内存碎片情况,由于对象朝生夕死的特性,所以内存的划分不是按照完整的1:1划分而是将一块内存分为一块较大的Eden和两块Survior空间,每次只使用一块Survior和一个Eden最后将活着的对象复制到另一块Survior中,当Survior内存不足时会从其他内存进行担保。

③标记整理算法

复制算法要经常进行复制操作因此效率也不是太高,因此出现了标记整理算法,清理过程仍然分为标记和清楚两个阶段,但是后续步骤不是对可回收对象进行清理而是将存活的对象都移动到一端然后直接清理端边界外的内存

分代收集算法

分代收集算法是将对象存活的周期不同将内存划分为几块,一般是把堆分为新生代和老年代。然后根据各个代实行不同的算法。一般新生代使用复制算法老年代使用标记清理或者标记整理算法



阅读全文
0 0
原创粉丝点击