理解Java垃圾回收算法

内存区域

Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。

image

具体参考:Java内存区域与内存溢出

常用的垃圾回收算法:

  • 引用计数算法:

    给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器值为0 的对象就是不再被使用的,垃圾回收器将收回该对象所使用的内存。
    引用计数算法实现简单,效率很高,微软的COM技术、ActionScript、Python等都使用了引用计数算法进行内存管理,但是引用计数算法对于对象之间相互循环引用问题难以解决,因此java并没有使用引用计数算法。
  • 根搜索算法:

    通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时,则该对象不可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。
    主流的商用程序语言C#、java和Lisp都使用根搜素算法进行内存管理。
    在java语言中,可作为GC Root的对象包括以下几种对象:
    a. java虚拟机栈(栈帧中的本地变量表)中的引用的对象。
    b.方法区中的类静态属性引用的对象。
    c.方法区中的常量引用的对象。
    d.本地方法栈中JNI本地方法的引用对象。

Java中使用的垃圾回收算法:

  1. 引用计数法:缺点是无法处理循环引用问题
  2. 标记-清除法:标记所有从根结点开始的可达对象,缺点是会造成内存空 间不连续,不连续的内存空间的工作效率低于连续的内存空间,不容易分配内存
  3. 复制算法:将内存空间分成两块,每次将正在使用的内存中存活对象复制到未使用的内存块中,之后清除正在使用的内存块。算法效率高,但是代价是系统内存折半。适用于新生代(存活对象少,垃圾对象多)
  4. 标记-压缩算法:标记-清除的改进,清除未标记的对象时还将所有的存活对象压缩到内存的一端,之后,清理边界所有空间既避免碎片产生,又不需要两块同样大小的内存快,性价比高。适用于老年代。
  5. 分代
    详细内容参考: 深入理解java垃圾回收算法
    参考:深入理解 Java 垃圾回收机制

你可能感兴趣的:(理解Java垃圾回收算法)