java GC将内存划分为三块,第一块为Permanent Generation,第二块为Old Generation,第三块分为New Generation(又称Young Generation)。其中New Generation包含Eden区和两块Survivor区,如图。
其中PermanentGeneration区存放java中的类与类加载器,此外,对以上各区大小也有一定的设置建议,如Young区为整个堆区的1/4,而Survivor区一般为Young区的1/8.
Old区存放的是Young区的Survivor满后触发Minor GC仍存活的对象,当Eden区满后会将对象存至Survivor区,如果Survivor区仍存不下这些对象,将会把这些对象直接存放至Old区,如果Old区也满了,则会触发Full GC回收整个内存.一般采取mark-compact算法进行内存回收。
Young区分Eden区与两个Survivor区,其中所有全创建的对象都存在Eden区,当Eden区满后会触发Minor GC将Eden区仍然存活的对象复制到Survivor区中,另一个Survivor区中存活的对象也复制到这个Survivor区中,并且保证始终有一个Survivor区是空的.一般采用copying算法进行内存回收。
首先Eden区域满后触发Minor GC将Eden区仍然存活的对象复制到Survivor区中,如图(GC前后对比):