记忆集
,在新生代上建立全局的记忆集,把老年代划分为若干个小块,标识出老年代的哪一块内存会存在跨代引用,此后在Minor GC时,只有包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描)HotSpot虚拟机中,根据对象存活周期的不同,将内存划分为几块。一般是将Java堆分为新生代和老年代,比例为2:1
;新生代又细分为Eden
区、From Survivor
区和To Survivor
区,比例为8:1:1
。不同的代采用不同的回收算法:
知道了如何判定无用的对象、废弃常量和无用的类后,接下来就是将这些无用的对象给回收掉。 如下是常用的3种垃圾收集算法。
该算法分为标记和清除两个阶段。
这种方法有2个不足:
为了解决效率问题,复制算法出现了。它将可用内存按容量划分为大小相同的两块,每次只使用其中的一块。当这一块内存用完,需要进行垃圾收集时,就将存活的对象复制到另一块上,然后清除掉这一块内存。 这种算法有优有劣:
为了解决空间利用率问题,可以将内存分为3块:Eden、From Survivor、To Survivor,比例是8:1:1,每次使用Eden和其中一块Survivor。回收时,将Eden和Survivor中存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才使用的Survivor空间。这样只有10%的内存被浪费。
但是无法保证每次回收都只有不多于10%的对象存活,当Survivor空间不足时,需要依赖其他内存(老年代)进行分配担保。
分配担保是指如果另一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时(超过10%),这些对象将直接通过分配担保机制进入老年代。
该算法分为标记和整理两个阶段。
这是一种老年代的收集算法,老年代的对象存活时间比较长。