JVM学习笔记——GC概述

 

目录


它是最基础的算法,后续的算法都是针对它的缺点改进而生。它存在两个缺点:
  • 效率问题。标记与清除这两个过程效率都不高。
  • 空间问题。如图所示,清除后的内存空间是不规整的,会产生大量的内存碎片。大量的碎片会导致分配大对象时,找不到连续的内存空间而提前触发另一次GC。
     
  • 复制算法(Copying)

    Copying
    针对标记-清除的效率问题,复制算法将内存分为两块空间,每次只使用其中一块。当这块的内存空间用完时,将存活的对象移到另一块中,然后将已使用的内存空间一次性清理掉。这样做的好处是不会产生碎片,清除也是针对连续的空间做处理,只要移动堆指针就行。
    实际上在现在的虚拟机中,将这种算法应用在新生代。按照8:1:1的比例将内存分为三块,每次使用一块较大的与较小的其中一块,清理时将存活对象移到剩下的一块中,这样每次只会浪费10%的内存,由于新生代中的内存一般都是“朝生夕死”的,使用这种算法可以极大的提升效率。但是,不能保证每次清理时,剩下的一块空间能够存放所有的存活对象,所以这里会依赖其他内存空间(一般指老年代)进行分配担保(Handle Promotion)。

  • 标记-整理算法(Mark-Compact)

    Mark-Compact
    复制算法在对象存活率较高时,效率就会变低,所以针对高对象存活率的情况,就有人提出了该算法。标记的过程并没有变化,但标记后并不是进行“清除”,而是将存活的对象向一端进行移动整理,然后清除掉其余的空间。现代虚拟机常将这种算法在老年代中使用。

  • 分代收集算法(Generational Collection)

    分代收集算法是根据对象的存活时间,将内存划分几块(一般分为新生代和老年代),这样就可以根据不同的内存区域特点采用不同的算法。针对新生代,使用复制算法,用少量的内存空间换来更大的效率;针对老年代,使用标记-整理或标记-清除来处理。

  • 作者: 薄峰 
    出处: http://www.cnblogs.com/qbzf-Blog/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。https://www.cnblogs.com/qbzf-Blog/p/9573334.html
    50000+
    5万行代码练就真实本领
    17年
    创办于2008年老牌培训机构
    1000+
    合作企业
    98%
    就业率

    联系我们

    电话咨询

    0532-85025005

    扫码添加微信