分代收集理论
分代假说:
1、弱分代假说:绝大多数对象都是朝生夕灭的。
2、强分代假说:熬过越多次垃圾收集的对象就越难消亡。
跨代引用假说:跨代引用相对于同代引用只占极少数。根据这条假说,不应再为少量跨代引用扫描整个老年代,不必浪费空间记录每一个对象跨代引用的情况,只需在新生代建立一个全局的数据结构“记忆集”,把老年代分为若干小块,标识出老年代的哪一块存在跨代引用。发生新生代垃圾收集时,只有包含跨代引用的小块内存会被加入到GC Roots进行扫描。
分代垃圾收集
部分收集 Partial GC:不是完整收集整个堆的收集分为:
新生代收集 Minor GC / Young GC 新生代的垃圾收集。
老年代收集 Major GC / Old GC 老年代收集(“Major GC”的说法在某些资料中指整堆收集)。
混合收集 Mixed GC :收集整个新生代和部分老年代。
整堆收集:收集整个Java堆和方法区。
垃圾收集算法
标记-清除算法
分为两个步骤:“标记”和“清除”。先标记需要回收的对象(或标记不需要回收的对象)
该算法的缺点:
1、执行效率不稳定,执行效率受对象数量影响。
2、内存空间碎片化问题,标记、清除后可能会产生大量不连续的空间碎片。
标记-复制法
半区复制:将内存分成相同大小的两块区域,每次只使用一块,当使用的内存块满了后,将存活的对象复制到另一块上,对使用的块的空间进行清理。分配内存时,顺序分配即可,因为清理是针对一整个块进行,不用担心碎片问题。
Appel式回收:把新生代分为一块较大的Eden区和两块较小的Survivor区,三个区域的默认比例是8:1:1。
每次回收时,只回收Eden和一块Survivor,将存活的对象回收到另一块Survivor上。
标记-整理算法
标记过程与标记清除法一样,然后让存活的对象往内存空间的一侧移动,然后清理掉边界以外的内存。移动存活对象的弊端在于移动过程中必须暂停用户应用程序。