New(年轻代)
1、堆内存
2、用来存放JVM刚分配的Java对象3、(a):Eden用来存放JVM刚分配的对象
(b):Survivor1
(c):Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,
当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。
4、当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
Tenured(年老代)1、堆内存
2、年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代
4、当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
永久代(Perm)1、虚拟机直接分配(XX:PermSize -XX:MaxPermSize 等参数调整其大小)
2、永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。
4、当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载
内存泄漏及解决方法:
1.系统崩溃前的一些现象:
每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s
FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC
年老代的内存越来越大并且每次FullGC后年老代没有内存被释放
之后系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值