jvm堆内存分代

jvm堆内存中,大概可分为新生代,老年代,永久代(以前可以看作是方法区),由于现在的jvm已经去永久代了,所以实质上只有前两种

1.新生代 : 新生代又分为eden区域和两个survivor区域。默认大小比例为8:1. 大部分新生成的对象都直接分配在eden中,如果在新生代中执行一次gc,eden中     未被回收的对象就会进入survivor区域中,同时对象的年龄+1,经过多次gc后,如果年龄大于一个阈值,对象就会进入老年代。因为很多对象生命周期短暂,因此这部分的

gc往往能回收掉大部分内存(大概80%)。这段区域的gc成为minor gc或者young gc.

2.老年代:一般大对象或者新生代经过多次gc仍未被回收的对象进入这个区域。这部分的gc称为full gc,full gc执行时间长,同时由于gc期间要暂停一切正在执行的线程,所以如果

                 老年代区域的内存过大,一旦执行gc,中断的时间越长,给用户带来的体验就越差。

所以给jvm分配大内存的前提,是保证full gc执行的频率较低。一般十几个小时或一天执行一次full gc,这样可以通过在深夜执行定时任务的方式触发Full GC甚至自动重启应用服务器来保持内存可用空间在一个稳定的水平。控制Full GC频率的关键在于保障老年代的稳定。否则,内存分配越大,实际使用情况越糟糕。

你可能感兴趣的:(JVM)