说起java垃圾收集器大家估计都没什么印象其实就是GC嘛,笔试GC题目被虐无数次,我没看java虚拟机的时候我也不知道是怎么,在这里顺便跟大家推荐一本书吧,《深入理解java虚拟机》好啦废话少说还是进入正题吧。
一.GC介绍
GC垃圾收集器是java虚拟机上实现内存回收技术的,它跟c++的不一样,c++没创建一个对象都需要对生命周期结束的对象进行free处理来释来放内存空间,而java内存回收机制更加灵活,它会自动回收内存的垃圾,让开发者更关注业务流程。
二.GC对象存活判断算法
GC在内存回收垃圾的时候,会先判断对象是否存活,还是挂掉了,并且回收挂掉的对象。
在虚拟机中对象存活判断方法主要有两种:引用计数算法(不属于jvm HotSpoot的方法)和可达性分析方法(属于JVM的方法)。
引用计数算法:
引用计数算法的原理是这样的:为对象设置一个计数器,当一个地方引用的时候就+1,当引用失效的时候就-1,当计数器的值为0的时候就开始回收内存空间。在这里是不是觉得它是一个很好的算法,但是一般不会用在java虚拟机上,因为如果存在循环引用的话就会永远释放不了内存。下面举个例子:
public classMyObject {
public Objectref=null;
public static void main(String[] args) {
MyObject myObject1 =newMyObject();
MyObject myObject2 =newMyObject();
myObject1.ref= myObject2;
myObject2.ref= myObject1;
myObject1 =null;
myObject2 =null;
}
}
在这个例子里面存在myObject1.ref= myObject2; myObject2.ref= myObject1;的相互引用,这样计数器永远不会为0.所以无法使用引用计数算法来进行回收这部分的内存。
可达性分析算法:
可达性分析算法是根据“GCroot”的对象作为起点分析对象是否可用的,而根据这个结点往下搜索,搜索所走的路径为引用链,如果不在这个链中的话(就是GCroot到这个对象是不可到达的话,那么证明这个对象是不可到达,可以进行回收)
根据上图可以知道object5,6,7都是不可到达的,那么判断其为可回收对象,而在引用的过程,有一些引用对象存在意义不大,就好像是“食之无味,弃之可惜”的对象,在内存使用比较紧张的时候可以进行回收,这里可以看一下关于引用类型(关于强引用,软引用,弱引用,虚引用)的文章地址为:http://blog.csdn.net/kuiyi3269/article/details/77284737