深入理解Java虚拟机(四) 垃圾回收机制

Write Once Run Anywhere,一次编写多处运行

一、判断垃圾的方法

  Java判断垃圾的算法主要是以下两种:

  引用计数算法

  • 给对象中添加一个引用计数器,当有一个地方引用它,计数器加1,当引用失效,计数器减1,任何时刻计数器为0的对象就是不可能再被使用的 。实现非常简单。
  • 没办法解决循环引用问题。比如:对象A有一个引用指向B对象,B也有一个引用指向A,如果A和B都没有被其他对象引用,其实已经是垃圾,但是没办法回收。
  • 并不实用,几乎没有主流的编程语言用这种GC判断算法(书本上一般按照这个来讲)

  根搜索算法

  • 通过一系列的称为“GC Roots”的点作为起始进行向下搜索,当一个对象到GC Roots没有任何引用链(Reference Chain)相连,则证明此对象是垃圾。
  • GC Roots包括: 1. JVM Stack的引用变量 2.方法区中的静态引用 3. JNI(即一般说的Native方法)中的引用
    Java, C#, Lisp等有GC特征的语言都是用根搜索算法

二、JVM常见的垃圾回收算法

  1、标记-清除算法(Mark-Swap)

  2、标记-整理算法(Mark-Compact)

  3、复制算法(Copying)

  4、分代算法(Generational)

posted @ 2017-03-04 16:50  拾光者2013  阅读(190)  评论(0)    收藏  举报