深入理解Java虚拟机(二)

垃圾收集器

1、垃圾收集器根据GC的分代策略也被用在不同的分代中:年轻代Serial、ParNew、Parallel Scavenge、GI)、老年代(CMS、Serial Old、Parallel Old、GI);其中GI收集器年轻代和老年代都可以使用。

先上图,他们之间的连线表示可以配合使用。

《深入理解Java虚拟机(二)》

2、垃圾回收算法

      垃圾回收其实就是回收已经死掉没有用的对象实例。对于如何判定对象已死,主要有引用计数算法和可达性分析算法。

引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1,计数器为0的对象代表已经不被使用,即已死;优点:实现简单,效率快,缺点:很难解决对象之间的相互循环引用。

可达性分析算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点朝下搜索,搜索所走过的路径称为引用连接,当一个对象到GC Roots 没有任何引用连接(当然java里又分为了强引用、软引用、弱引用和虚引用),即该对象到GC Roots 不可达,就代表该对象不可用(已死),java采用的就是可达性分析算法。


gc的回收算法主要有标记-清除算法、复制算法、标记-整理算法

标记-清除算法:基本算法,标记出需要回收的对象,之后统一回收所有被标记过的对象。缺点:标记和清除效率都不高;清除后产生大量不连续的内存碎片(如果碎片太多,在分配大对象时,无法获取足够的连续内存就会提前触发垃圾回收动作)。

复制算法:把内存分为大小相等的两块,每次只使用一个,当这个内存满了后,就把还存活的对象复制到另外一块内存空间中,然后把之前已使用满的那块全部清除掉。优点:实现简单、运行高效。缺点:吃内存,浪费了一半。(一般年轻代会采用该算法,但是不是分为1:1的比例划分内存空间,而是分成一个较大的Eden和两个较小的Survivor,一般比例是默认8:1,可通过jvm参数-XX:SurvivorRatio设置每次只使用Eden和其中一个Survivor,如果是8:1的话,就只浪费了10%的内存资源,是完全可以接受的)。

标记-整理算法:过程和标记-清除算法一样,但是最后不会清除,而是让存活的对象朝一边移动,然后清除掉边之外的内存。

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/u013926113/article/details/78274968
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞