如何判断对象可以被回收
Java虚拟机采用可达性分析算法,即从一个根节点向下搜索所有节点,当一个对象无法到达时(孤岛),就判断该对象是可回收对象。
怎么回收对象
标记-清除对象算法
这个算法分为两个阶段:标记和清除,在内存中标记哪些对象是可以被回收的,在标记完成后,统一回收这些被标记的对象。
这么做的很大一个问题是,使得可用的内存区域变得十分零散不连续,如果要分配一个内存区域时,无法提供足够的连续内存而不得不触发另一次的垃圾回收。
复制算法
这种算法是将内存划分为大小相等的两块区域,每次只使用其中的一块,当要进行垃圾回收时,将存活的对象直接复制到另一块空闲的内存,而刚刚的那块内存直接全部清除,效率高但是按1:1划分很浪费空间。
对于大多数对象都是“新生代”对象,即生命期很短,从而将内存划分为8:1:1,一块大内存Eden两块小内存Survivor,每次都是使用Eden和其中一块Survivor,当进行垃圾回收时,把存活对象复制到另外一块空闲的Survivor,将Eden和之前的Survivor清除。但是当Survivor无法存放所有的存活对象时,通常是将这些对象分配到“老年代”或者有额外空间进行担保。
标记-整理算法
标记过程与之前的一样,标记完成后,让存活对象向内存的一端移动,然后清除掉剩余区域。
分代收集算法
Java堆根据对象的存活周期划分为“新生代”和“老年代”。对于新生代,存活周期较短,可以使用复制算法。对于老年代,存活周期长,显然复制算法是不适合的(没有额外空间进行担保),使用标记-清除或者标记-整理算法。