【JVM】自动内存管理机制《四》---垃圾收集器(索命黑白无常回收垃圾对象)

目录

导读

 宏观概览

 哪些内存需要回收?

 垃圾收集算法 

复制算法

 标记清除算法

标记整理算法

分代收集算法

 垃圾收集器

小结


导读

 接下来本篇博客着重讲:如何自动管理内存,今天接着解决第三个问题,详细会按以下思路讲解-:如何自动管理的?谁管理的?接下来按下面的顺序讲述,我们已经讲完了对象存活的判定,接下来要讲垃圾收集算法,垃圾收集器:

 内存回收机制

     *  对象存活判定算法

     * 哪些内存需要回收

     * 垃圾收集算法

     *  垃圾收集器(对垃圾收集算法的实现)

 内存分配与回收策略

     * 原则

 宏观概览

 垃圾收集算法有4种,如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现,图中指示出不同的垃圾收集器所使用的垃圾收集算法,以及收集器回收的是那部分的垃圾,以及单线程或多线程。

 

 哪些内存需要回收?

 堆和元数据区的内存需要回收,其余的不需要回收。因为只有堆和元数据区是线程共享的,其余的是与线程“同生共死”的,线程结束,内存自然就跟着回收了,所以不用管它们。

 垃圾收集算法 

复制算法

历史定义:把young内存按照 1:1 的比例划分:A和B,一个用来负责装载正常的对象信息,一个用来做垃圾回收。每次把A中存活的对象全部复制到B里面,再一次性的将A删除。

现在的商业 JVM 都采用这种算法来回收新生代,不同的是:其中,伊甸区和幸存0、1区的比例是:8:1:1。研究表明,新生代中的对象 98% 是 “朝生夕死” 的,所以不必按照 1:1 的比例来划分空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中的一块 Survivor,当回收时,将 Eden 和 Survivor 中还存活着的对象一次性地复制到另外一块 Survivor 空间,最后清理掉 Eden 和刚才用过的 Survivor 空间。HotSpot VM 默认 Eden 和 Survivor 的大小比例是 8:1,也就是每次新生代中可用内存空间为整个新生代容量的 90% (80% + 10%)。当然,我们没有办法保证每次回收都只有不多于 10% 的对象存活,当 Survivor 空间不够用时,这些对象将直接通过分配担保机制进入老年代。

特点:没有碎片问题,但是内存缩小为了原来的一半。适用于新生代的回收。


 标记清除算法

定义:先标记,再清除。先开始对存活的对象进行标记,然后将没有被标记的对象进行回收。

特点:1.会产生大量的碎片,导致有大量碎片内存剩余的情况下,由于没有连续的空间来存放较大对象而又一次出发垃圾收集动过  2.效率不高;


标记整理算法

定义:前面两者的综合,先标记、清除完,然后将存活的对象移动到内存的一端。

特点:成本较高,但是解决了碎片问题。适用于老年代的回收。


分代收集算法

分代收集算法就是目前虚拟机使用的回收算法,它解决了标记整理不适用于老年代的问题,将内存分为各个年代。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。

ç´éBATå¿èé¢ç³»åï¼JVMç4ç§åå¾åæ¶ç®æ³ãåå¾åæ¶æºå¶ä¸æ»ç»

在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。而老年代对象存活率搞,没有额外空间对它进行分配担保,所以只能使用标记清除或者标记整理算法。

 垃圾收集器

 上面讲了目前所有的垃圾收集算法,这些算法是由谁去实现并执行的呢?那就是垃圾收集器。宏观可以看下文章开始的那张图,

 本篇博客篇幅太长,关于垃圾收集器请看下篇:【JVM】自动内存管理机制《五》---垃圾收集器(索命黑白无常回收垃圾对象)

小结

 以上讲了垃圾收集器能做什么,下篇博客讲下垃圾收集器都有哪些:【JVM】自动内存管理机制《五》---垃圾收集器(索命黑白无常回收垃圾对象)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值