云计算培训学院:虚拟机堆内存结构

JVM中堆空间可以分成三个大区,年轻代、老年代、永久代(方法区)。所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。

年轻代分为三个区域:EDEN、Survivor0(简称S0,也通常称为from区)、Survivor1(简称S1,也通常称为to区)。其中S0与S1的大小是相同等大的,三者所占年轻代的比例大致为8:1:1,S0与S1就像"孪生兄弟"一样,我们大家不必去纠结此比例(可以通过修改JVM某些动态参数来调整)的大小.只需谨记三点就好:

1.S0与S1相同大小。
2.EDEN区远比S(S0+S1)区大,EDEN占了整个年轻代的大致70%至80%左右。

3.年轻代分为2个区(EDEN区、Survivor区)、3个板块(EDEN、S0、S1)。

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。那一个对象到底要经过多少次垃圾回收才能从年轻代进入老年代呢?

我们通常认为在新生代中的对象,每经历过一次GC,如果它没有被回收,它的年龄就会被加1, 虚拟机提供了一个参数来可控制新生代对象的最大年龄:MaxTenuringThreshold。默认情况下,这个参数是15。 也就是说,在新生代的对象最多经历15次GC,就可以进入老年代。

假如存在一种这样的情况,一个新生代对象,占用新生代空间特别大。在GC时若不回收,新生代空间将不足。但是若要回收,程序还没有使用完。此时就不会依据这个对象的 MaxTenuringThreshold 参数。而是直接晋升到老年代。所以说MaxTenuringThreshold 参数是晋升老年代的充分非必要条件。

最后永久代也通常被叫做方法区。是一块所有线程共享的内存区域。用于保存系统的类信息,比如类的字段、方法、常量池。

猜你喜欢

转载自blog.51cto.com/13694927/2117589
今日推荐