三大假说
- 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
- 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。
- 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅占极少数。
垃圾收集器
垃圾收集器:新生代收集器,老年代收集器,混合收集器
部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集,其中又分为:
- 新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。
- 老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。
- 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。
当前我们使用的就是G1收集器。
G1收集器是分区域收集垃圾,不会一下停止所有的操作。但是仍然会对回收的那部分产生影响,我们无法做到不产生影响。只能缩小影响。我们之所以考虑那么多中收集器和垃圾回收算法都是为了减小影响。使其在垃圾回收的时候和其他线程的冲突尽可能降低。
垃圾回收算法
- 标记清除法:第一遍先把把死亡的对象进行标记,然后第二遍去删除掉标记的对象。缺点是产生空间碎片太多。
- 标记复制法:将空间分成两部分,一边是空的,另一边存对象。遍历存对象的一边,将存活的对象复制到空白一侧,然后删除原来有对象区域的所有对象。速度快,但是需要的空间大,对内存的损耗大。适用于年轻代。
- 标记整理法:遍历后将存活下来的对象都整理到一起,不零散分布。内存利用率好,但是性能慢。适用于老年代。