java语言并不要求JVM有gc,不过常用的JVM都有gc。这里介绍hotspot的generation gc,即分代gc的机制。
分代gc的算法是,主要根据一个统计数据,就是java98%的对象都不会被长时间引用。所以分代gc就把java堆分为young generation(新生代)和old generation(老生代)。young generation的gc称为minor gc,young generation分为一个Eden区和两个survivor区,一般对象都放在Eden区,等Eden区满了之后会转移到survivor区,这个从Eden区满了之后转到surviror区满了之后会转移到Old generation,如果两个survivor都满了会直接转移到old generation。注意:两个survivor区是同个等级的,同一时间两个 survivor空间中有一个用来保存对象,而另一个是空的,用来在下次的新生代GC中保存对象。新生代执行频率高,速度快;老生代执行频率低,速度慢。old generation的gc称为major gc,就是常说的full gc。minor gc会引发full gc,当eden+survivor1大于old generation的剩余空间时,会引发full gc。
还有个代是永生代(permenant generation),这里存储的是一些类信息,方法的信息,静态变量和classloader的引用,这个代属于方法区,sun的JVM不会去回收这个代。像spring和hibernate这些需要动态类型支持的框架,这个区域需要有足够的空间。