垃圾回收的算法

垃圾收集算法

  • 1)引用计数法

    给对象添加引用计数器,当引用对象时计数器+1,引用失效时,计数器-1,当计数器等于0时,对象失效,内存可以被回收。
    优点:实现简单高效。
    缺点:对象之间的互相循环引用问题不好解决。

  • 2)可达性算法(根搜索法)

    通过GC roots可达的对象路径称为引用链(reference chain),当一个对象没有引用链时(即从GCroots不可达)则视为不可用对象,内存可以被回收。java使用该算法进行垃圾收集。可解决循环引用的问题

    哪些对象可以视为GC roots ?
    a. 虚拟机栈中(即栈帧中的本地变量)的引用对象;
    b. 本地方法栈中的引用对象;
    c. 方法区(永久代)中的静态变量引用的对象和常量池中引用的对象

清除算法
1.标记清除算法
垃圾回收的算法

垃圾回收的算法

2.复制算法

垃圾回收的算法

垃圾回收的算法

垃圾回收的算法
3.标记压缩算法

垃圾回收的算法

垃圾回收的算法
垃圾回收的算法

4.分类收集算法
垃圾回收的算法
5.增量收集算法
垃圾回收的算法
6.分区算法
垃圾回收的算法

  • 1)标记-清除算法(mark-sweep)

    分两步进行,第一步标记出可以回收的对象,第二步统一清理可以回收的对象内存。 缺点:首先标记和清除步骤效率都不高,其次会产生内存碎片。

  • 2)复制算法

    将内存分为(大小相等)两部分,每次只使用其中一块进行内存分配,当内存使用完后,就出发GC,将存活的对象直接复制到另一块空闲的内存中,然后对当前使用的内存块一次性清除所有,然后转到另一块内存进行使用。
    优点:简单,高效。 缺点:浪费内存,因为每次都有另一块内存空闲着。

  • 3)标记-整理算法

    类似于标记-清除算法,但是第二步进行内存回收时,将存活的对象向内存一端移动,达到消除内存碎片问题。

  • 4)分代收集算法

    java sun
    hotspot虚拟机将内存分为新生代(堆)、老年代(堆)、永久代(方法区、常量池、即时编译代码)几个区域,新生代主要使用基于复制算法的垃圾回收,老年代和永久代主要使用标记-整理算法进行垃圾回收。具体每个区域使用哪种垃圾回收算法还要视收集器的实现制约。