Java 垃圾收集机制
1.判断一个java对象需要被回收
可达性分析
如果一个对象和gc root节点之间没有任何引用链,那么就判断这个对象不可达
2.垃圾收集算法
2.1 标记-清除算法
在一块内存区域里面,将所有标记为可回收状态的对象进行回收并释放所占用的内存区域。就叫标记清除算法。
标记清除算法的缺点是如果回收的内存区域都是不连续的区域的话,可能导致再为一个大对象进行分配内存时找不到合适的内存,从而导致提前触发下一次的gc。
2.2 复制算法
复制算法的原理是将一块内存区域分成2部分,每次使用的时候只使用其中的一部分,另一部分空闲,当发生gc时,将不需要回收的对象都复制到空闲的内存区域里面,然后对之前的那个区域的内存进行整体回收。
复制算法解决了标记清除算法的缺点。但是他也有自己的缺点,使用复制算法的缺点是内存中始终有一块内存需要作为内存复制的地方而不能利用。
Hotspot虚拟机中新生代就使用了复制算法,他把新生代分为3块:1个eden区和2块survivor区,eden区占新生代的80%空间,2个survivor分别占10%。新生代区域的回收效率一般都很高,有90%以上,所以每次将一个survivor和eden中的内存回收后剩下的不到10%的对象可以放在另一个survivor中。这种策略下内存利用率达到了90%。
如果进行一个gc后剩余的内存要大于survivor的空间,这个时候就可以把这些对象移入老年代。这种分配机制叫做分配担保(handle promotion).
2.3 标记-整理算法
标记整理算法是对标记清除算法的优化。将所有的内存中的对象都往同一个方向移动,消除对象之间的空闲内存,最后清除掉边界之外的内存。老年代使用这种算法。