本文主要是介绍【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)。
在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。而老年代对象存活率搞,没有额外空间对它进行分配担保,所以只能使用标记清除或者标记整理算法。
垃圾收集器
上面讲了目前所有的垃圾收集算法,这些算法是由谁去实现并执行的呢?那就是垃圾收集器。宏观可以看下文章开始的那张图,
本篇博客篇幅太长,关于垃圾收集器请看下篇:【JVM】自动内存管理机制《五》---垃圾收集器(索命黑白无常回收垃圾对象)
小结
以上讲了垃圾收集器能做什么,下篇博客讲下垃圾收集器都有哪些:【JVM】自动内存管理机制《五》---垃圾收集器(索命黑白无常回收垃圾对象)。
这篇关于【JVM】自动内存管理机制《四》---垃圾收集器(索命黑白无常回收垃圾对象)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!