[jvm]垃圾回收算法

0. 垃圾回收算法概述

标记清除算法
	|
	|--- 标记时间过长
	|		|
	|		|--- CMS:通过初始标记、并发标记和重新标记来拆分标记过程
	|		
	|--- 垃圾回收后,导致内存碎片过多 
			|
			|--- 标记压缩算法:将垃圾移动到一侧来减少内存碎片
			|
			|--- 标记清除算法:将垃圾复制到另一块内存中解决内存碎片
	

  

1. 标记清除算法

工作方式:

1)标记阶段:通过可达性分析[1]查找出与GC Root无直接或间接关联对象,将其标记为待回收对象

2)清除阶段:清除待回收对象

不足:
1)标记和清除两个过程的效率不高;
2)标记清除之后会产生大量不连续的内存碎片。因此,在分配大内存对象时,会因无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
 

  

 

 

2. 标记复制算法

标记复制算法工作原理:将可用内存按容量划分为大小相等的两块,每次只是用其中一块。当这一块内存用完了,就将还存活的对象复制到另外一块上,然后再把已使用过的内存空间一次清除掉。Hotspot将内存分为Eden和两个Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor上,最后清除掉Eden和刚才用过的Survivor空间。当Survivor控件不够用时,需要依赖老年代进行分配担保。目前,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1.
 
 
3. 标记压缩算法
标记压缩算法的工作原理:首先标记出所有需要回收的对象,在标记完成后将所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
 
4. CMS算法 
CMS算法将标记阶段拆分为以下几个步骤:
1)初始标记阶段:将所有工作线程暂停(STW),仅标记与GC Root直接关联的对象
2)并发标记阶段:与工作线程一起工作,标记与GC Root间接关联的对象
3)重新标记阶段:将所有工作线程暂停(STW),修复在初始标记后与GC Root关联关系发生变化的对象
 
 
概念描述:
[1] 可达性分析算法的基本思想:将"GC Roots"对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相相连时,则证明此对象时不可用的。缺点:在检索时,需要将JVM中应用暂停,以便分析无用对象。防止在分析中有无用对象被重新引用。
在Java语言中,可作为GC Roots对象:
1)虚拟机栈(栈帧中的本地变量表)中引用的对象。
2)方法区中类静态属性引用的对象。
3)方法区中常量引用的对象。
4)本地方法栈中JNI引用的对象。
posted @ 2015-07-11 15:50  life91  阅读(287)  评论(0编辑  收藏  举报