垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:
1:年轻代(Young Generation) 采用复制算法收集内存
堆有年轻代 (由一个Eden区和俩个survivor区组成),老年代,持久代。新创建的对象都在年轻代的Eden区,经过一次JC收集后,存活下来的会被复制到survivor区(一个满了,就全部移动到另外一个大的中,但要保证其中一个survivor为空),经过多次JC后,还存活的对象就被移到老年代了
2:年老代(Old Generation)、
长期存活的对象将进入老年代,JVM给每个对象定义了一个对象年龄(age)计数器 如果对象在Eden出生并经过第一次Minor GC后仍然能存活,
并且能被Survivor容纳 ,将被移到Survivor空间中,并且对象年龄设为1,当它的年龄增加到一定程度(默认15)就会被晋升到老年代中。
3:永久代(Permanent Generation,也就是方法区)。
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代 。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池。