Java中JVM内存管理之标记/清除算法

在之前的一片文章中,介绍了Java中JVM内存管理的基本的原理和概念,这次就单独的算法和实现原理做一下简单的总结和归纳,同时也向各位大神学习,get新姿势。(参考文章来源:左潇龙的《JVM内存管理–GC算法精解(五分钟让你彻底明白标记/清除算法)》一文,原文链接:http://www.importnew.com/22996.html)

这里我们主要解决的是理解标记/清除算法,那么我们首先得知道标记/清除算法是个神马?

    标记/清除算法,就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将依旧存活的对象标记一遍,最终再将堆中所有没被标记的对象全部清除掉,接下来便让程序恢复运行。
    它的做法是当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被成为stop the world),然后进行两项工作,第一项则是标记,第二项则是清除。

其中最重要的两点:

    标记:标记的过程其实就是,遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象。
    清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

以上是文字说明,但是是在有点难以理解,下面就是看图说话,来解释标记清除算法是怎么回事:
Java中JVM内存管理之标记/清除算法_第1张图片

以上图1、图2、图3中分别是从未标记到被标记到清除的过程,这也是标记清除的具象化演示过程。没有被标记的对象将会回收清除掉,而被标记的对象将会留下,并且会将标记位重新归0。接下来就不用说了,唤醒停止的程序线程,让程序继续运行即可。

算法没有接近完美的,或多或少都有他 缺陷,那么标记清除算法缺点有是什么呢?

    1、首先,它的缺点就是效率比较低(递归与全堆对象遍历),而且在进行GC的时候,需要停止应用程序,这会导致用户体验非常差劲,尤其对于交互式的应用程序来说简直是无法接受。
    2、第二点主要的缺点,则是这种方式清理出来的空闲内存是不连续的,这点不难理解,我们的死亡对象都是随即的出现在内存的各个角落的,现在把它们清除之后,内存的布局自然会乱七八糟。而为了应付这一点,JVM就不得不维持一个内存的空闲列表,这又是一种开销。而且在分配数组对象的时候,寻找连续的内存空间会不太好找。

你可能感兴趣的:(java)