Java垃圾回收(GC)机制详解

垃圾回收算法有两种,根据不同的虚拟机策略不同

1、引用计数法 2、可达性分析法

由于我们平常使用的hotspot虚拟机用的是第二种。

那哪些是可达的呢?

这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。在Java语言中可以作为GC Roots的对象包括:

· 虚拟机栈中引用的对象

· 方法区中静态属性引用的对象

· 方法区中常量引用的对象

· 本地方法栈中JNI(即Native方法)引用的对象

 垃圾回收算法

第一步考量了哪些对象进行回收后,第二步自然是如何对对象进行回收了。这里主要写几种垃圾回收算法的思想。

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

2、复制(Copying)算法--主要应用在年轻代

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

 

分代收集

根据上面的内容,用一张图概括一下堆内存的布局

这里解释一下为什么有From Survivor和To Survivor。

垃圾收集器的联系如下图:

最新的垃圾收集器是G1

G1收集器

G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,JDK 7 Update 4后开始进入商用。在G1收集器之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1收集器不再是这样,使用G1收集器时,Java堆的内存布局就与其他收集器有很大差别,它将整个Java堆分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region的集合。G1收集器跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也是Garbage-First名称的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的收集效率。

 

未完待续。。。。。。

 

posted @ 2017-07-19 21:21  2015,加油!  阅读(129)  评论(0编辑  收藏  举报