JVM垃圾回收

来源:互联网 发布:ubuntu 15.04 vim配置 编辑:程序博客网 时间:2024/06/02 17:57

    最近一段时间因一次面试过程中被问及JVM垃圾回收的知识,而自己一无所知,甚觉惭愧,于是痛定思痛,恶补了一些JVM的知识、总算对JVM的垃圾回收有了一些基本的了解。废话不多说,学习笔记附上,以供后期自己复习用。

    JVM如何实现GC的呢?首先了解

一、堆分区

     JVM为了更好地实现GC,将其堆内存空间分为了两个区域,即新生代(Young)、老年代(Old)。新生代又被划分为三个区域:Eden、From Survivor、To Survivor。新生代与老年代内存空间大小的默认比例为1:2,该比例可以用:-XX:NewRatio=参数值  进行指定(注:NewRatio指的是老年代与新生代的比例,故默认值为2)。Eden区与From Survivor以及To Survivor区的默认比例为8:1:1,该比例可通过:-XX:SurvivorRatio=参数值 进行指定(注:SurvivorRatio是指Eden区与Survivor区的比例,默认值为4)。说了这么多,不如给张图来得明确,如下



二、GC回收算法的种类

目前JVM采用的垃圾回收算法是四种,标记-清除算法、复制算法、标记-压缩算法以及分代回收算法(最老的引用计数法已被淘汰)。现对四种算法分别解释

        1、标记-清除算法

                 

标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象该算法,标记和清除两个阶段的效率不高。此外,回收后会产生大量的不连续的内存碎片,进一步会导致垃圾回收次数的增加

        2、复制算法


 该算法的思想是将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块的内存用完了,则将还存活的对象复制到另外一块内存上去,然后再把刚使用过的内存空间一次清理掉。从而达到了每次垃圾回收时只是针对其中一块,避免了产生内存碎片等情况。

      该算法的代价是只是使用了其中一本的内存,代价有点高。

     3、标记压缩算法

                 

该算法集成了标记-清除和复制收集算法的优点。第一个阶段仍是进行标记,第二个阶段是把所有存活的对象都向一端移动,按顺序排放,然后直接清理掉端边界意外的内存。该算法避免了标记-清除的内存碎片问题以及复制算法的空间问题。

     4、分代回收算法

基于对象的生命周期划分为新生代、老年代以及持久代。比如新生代就采用复制收集算法,而老年代就采用标记-清除法、如何区分的新生代老年代呢?JVM为每个对象定义了一个对象年龄计数器。如果对象在Eden出生并且经过第一次新生代GC(Minor GC)后仍然存活并且能被Survivor容纳,则该对象将被移动到另一块Survivor空间,并将对象年龄计数器加1。对象在Survivor区中每经历过一次Minor GC,年龄计数器就加1,当它的年龄达到设定的阈值(默认是15)时,则被移动到老年代中。阈值的设置通过参数-XX:MaxTenuringThreshold设置


0 0