【JVM】——GC机制之GC算法

      垃圾回收简介

      Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。


      一、内存分配机制

      要想分析GC机制,不得不先了解一下内存的分配机制。这里所说的内存分配,主要指的是在堆上的分配,一般的,对象的内存分配都是在堆上进行。概括的说,内存分配机制可以概括为“分代分配”。

      对象将根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。

     1、 新生代(Young Generation)可以划分为三个区,Eden区,两个幸存区。对象被创建时,内存的分配首先发生在年轻代(大对象可以直接被创建在年老代)。新生代内存分配过程如下:

      ①绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。Eden区是连续的内存空间,因此在其上分配内存极快;
      ②最初一次,当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0(此时,Survivor1是空白的,两个Survivor总有一个是空白的);
      ③下次Eden区满了,再执行一次Minor GC,将消亡的对象清理掉,将存活的对象复制到Survivor1中,然后清空Eden区;
      ④将Survivor0中消亡的对象清理掉,将其中可以晋级的对象晋级到Old区,将存活的对象也复制到Survivor1区,然后清空Survivor0区;
      ⑤当两个存活区切换了几次(HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值进入老年代,但这只是个最大值,并不代表一定是这个值)之后,仍然存活的对象(其实只有一小部分,比如,我们自己定义的对象),将被复制到老年代。
 


                                
          2、年老代(Old Generation):对象如果在年轻代存活了足够长的时间而没有被清理掉(即在几次Minor GC后存活了下来),则会被复制到年老代,年老代的空间一般比年轻代大,能存放更多的对象,在年老代上发生的GC次数也比年轻代少。当年老代内存不足时,将执行Major GC。


      二、GC的算法

      GC算法主要有:标记-清除算法、标记压缩算法及复制算法。接下来介绍一下各个算法和其适用对象和范围。


      1、标记-清除算法(Mark-and-sweep)
  标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,进入清除阶段,在清除阶段,清除所有未被标记的对象。如图所示:


 

      优点:解决了计数法的循环引用问题。

      缺点:

       ①暂停整个应用;

       ②会产生内存碎片。

       ③不管你这个对象是不是可达的,即是不是垃圾,都要在清楚阶段被检查一遍,非常耗时.


      2、标记-压缩算法(Mark-Compact)

      和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。标记-压缩算法适合用于存活对象较多的场合,如老年代。过程如图所示:

      

      优点:

      ①避免标记扫描的碎片问题;
      ②避免停止复制的空间问题。


      3、复制算法(copying)

      与标记-清除算法相比,复制算法是一种相对高效的回收方法。将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。不适用于存活对象较多的场合,如老年代。如图所示:


              


      优点:不会出现碎片问题。
      缺点:
      ①暂停整个应用。
      ②需要2倍的内存空间。


      根据不同代的特点,选取合适的收集算法:少量对象存活,适合复制算法;大量对象存活,适合标记清理或者标记压缩。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值