JVM 原理分析及调优

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/crevicer/article/details/61194329


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的临界值
展开阅读全文

没有更多推荐了,返回首页