# 弱分代假说
绝大多数对象都是朝生夕灭的(新生代)
# 强分代假说
熬过越多次垃圾收集的对象就越难消亡(老年代)
这两条假说结合jvm堆内存结构来理解:
新生代就是为刚生成的对象设计的,就像弱分代假说说的一样,绝大多数对象都是朝生夕灭的,比如刚生成100个对象,第一次垃圾回收的时候可能就回收了98个,那么设计垃圾回收的时候肯定是不能一个一个标记需要被回收的对象,然后再根据标记去回收这些对象。所以jvm的新生代将内存分为3部分,eden区,from区,to区;刚生成的对象都在eden区,等达到新生区的回收条件的时候,会进行Minor GC,将存活的对象放入from区,然后清空eden区,等下次在进行Minor GC的时候,就将存活的对象放入to区,然后清空eden区和from区。这就是GC算法中的**复制算法**
# 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅占极少数。
假如一个对象经过多次GC之后进入老年代,但是它还引用这新生代的一些对象,那么新生代发生GC的时候,是不是就需要去老年代查看老年代的对象引用着哪些新生代的对象?那么是需要去遍历整个老年代吗?如果是遍历整个老年代,那么GC时间是不是会很长?其实我们常用的虚拟机HotSport是在新生代区域中建立了一个**记忆集**这个**记忆集**将老年代划分为多个部分,记录着老年代哪一块存在跨代引用,那么在发生Minor GC的时候,就只需要遍历记忆集记录的那一部分老年代内存空间中的对象了。