深入理解Jvm垃圾回收机制

Jvm的垃圾回收算法主要由标记算法收集算法 组成

标记算法

标记算法又分为细分可以分为“引用计数算法”与“可达性分析算法”。
标记的主要作用是告诉Jvm虚拟机哪些对象是可以被Jvm虚拟机回收的,在Jvm发生GC的时候会回收掉这些垃圾。

引用计数算法

每个对象都有一个引用计数器,对象每被引用一次,对象的引用计数器就会+1,引用失效就会-1。
当一个对象的引用计数器为0时,这个对象就会被标记为可回收的“垃圾对象”。

class Bean{
	public Object o = null;
}

pulic class Test{
	public void static main(){
		Bean b1 = new Bean();	//b1(引用)+1 = 1
		b1 = null;	//b1(引用)-1 = 0	此时b1被标记为可回收“垃圾”,当发生GC时会被回收
	}
}

引用计数器也有缺点,就是当两个对象嵌套引用的时候无法被回收。看一下下面这个例子

class Bean{
	public Object o = null;
}

pulic class Test{
	public void static main(){
		Bean b1 = new Bean();	//b1(引用)+1 = 1
		Bean b2 = new Bean();	//b2+1 = 1
		b1.b = b2;	//b2+1 = 2
		b2.b = b1;    //b1+1 = 2
		b1 = null;	//b1-1 = 1	此时JVM发生GC时b1无法被回收
		b2 = null; //b2-1 = 1 b2也无法被回收
	}
}
可达性分析算法

将对象及引用关系看做一颗树,选定活动的对象作为GC Root。
然后跟踪引用链条,如果一个对象和GC Root之间不可达,也就是不存在引用,那么可以认为是可回收对象。
在这里插入图片描述
上图中只有Object5是不可达的,所以当JVM发生GC的时候会被回收

可被作为GC Root的对象有:

  • 虚拟机栈中正在引用的对象
  • 本地方法栈中正在引用的对象
  • 静态属性应用的对象
  • 方法区常量应用的对象

回收算法

经过标记算法的标记,Jvm在发生GC的时候就会对这些对象进行回收。
回收的算法又可以分为“标记-清除”、“标记-整理”、“复制”算法三大类。

标记-清除

根据标记算法标记可回收对象,之后将被标记的“垃圾”对象进行回收
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

优点:速度快、效率高
缺点:会产生碎片化空间

标记-整理算法

在“标记-清除”之后会对内存空间重新进行一次排序,将存活的对象整理到同一块内存中
在这里插入图片描述
优点:不会产生内存碎片化
缺点:效率低

复制算法

把内存分为两个区域进行存储,标记为From和To,每次存储对象只使用From区域的内存。
在进行垃圾回收时,Jvm会先把From区域中的存活对象全部拷贝到To区域中,此时From区域中没有了存活对象,会对From整个区域进行清除。
执行完清除操作后把From区域就变成了To区域,To区域变成了From区域。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优点:不存在内存碎片,效率高
缺点:占用双份内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值