深入理解java虚拟机系列二——垃圾收集算法

在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等。当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收。

商业虚拟机都采用分代收集算法,根据对象的存活周期的不同将内存分为几块:新生代,老年代。

新生代,每次垃圾收集都会有大批量对象死去,只有少量存活,所以适合采用“复制算法”;

老年代,对象存活率比较高,没有额外的分配担保,所以一般采用“标记-清理”活着“标记-整理”算法;

1.标记-清除

缺点:

  效率低下,标记和清除的过程效率都不高;

  空间问题,标记清除之后会产生大量不连续的内存碎片;

2.复制算法

它可以将内存按照容量分为大小相等的两块,当其中一块快要用完的时候,就将还活着的对象复制到另外一块上面,然后再把已用过的内存空间一次清理掉。

现代虚拟机都采用这种收集算法来回收新生代。但是并不需要按照1:1的比例划分内存,而是分为一块较大的Eden空间和两块较小的Survivor空间,每次使用凉快Survivor中的一块和Eden空间,当回收的时候将还活着的对象copy到另一块Survivor上,最后清理掉已经使用过的Survivor和Eden空间。HotSpot默认比例是8:1:1.如果Survivor上的空间不够,则会从其他内存(老年代)进行分配担保。

3.标记-整理

与标记-清除算法相似,在标记之后会将仍然活着的对象都像一端移动。然后清理掉边界以外的内存。

原文地址:https://www.cnblogs.com/fuxinci/p/3188041.html