JVM堆空间

JVM堆空间模型是GC视角下的内存模型。

JVM 堆空间划分

Java-Memory-Model

注:图中堆空间的划分不包括G1 gc。

年轻代

年轻代是所有新对象出生的地方,当年轻代空间占用接近GC阀值时,Minor GC执行回收工作。Young Generation分为三个部分--Eden(新生区)和两个Survivor空间(交换区)。

年老代

年老代内存中的对象是那些存活时间较长或从年轻代晋升过来的对象,通常,年老代垃圾收集器会在空间接近GC阀值时执行,年老代垃圾收集被称为Major GC。

永久代

Permanent Generation或“Perm Gen”包含应用程序中使用的类和方法的元数据。

注:Perm Gen不是Java堆内存的一部分。Perm Gen大小由JVM根据应用程序的使用情况而定,Perm Gen对象会在Full GC时被执行垃圾收集,Full GC会收集年轻代(Young Gen),年老代(Old Gen)和Perm Gen。 

方法区域(Method Area)

方法区域是Perm Gen空间中的一部分,用于存储类结构(运行时常量和静态变量)以及方法和构造函数的代码。 

内存池(Memory Pool)

内存池由JVM内存管理器创建,用于创建不可变对象池(如果实现支持它)。String Pool是这种内存池的例子。内存池可以属于Heap或Perm Gen,具体取决于JVM实现。 

运行时常量池(Runtime Constant Pool)

运行时常量池是每个类运行时类中常量的表示。包含类运行时常量和静态方法。运行时常量池是方法区域的一部分。 

Java栈内存(Java Stack Memory)

Java栈内存用于执行线程。包含特定于方法的特定值。

更多详情参见Java内存分配。 

JVM内存详细信息

使用jstat查询jvm内存信息:

admin@admin: ~/Downloads/jdk1.7.0_55/demo/jfc/Java2D$ java -Xmx120m -Xms30m -Xmn10m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar Java2Demo.jar

jstat

S0C和S1C

Survivor0和Survivor1区域的当前大小(KB为单元)。

S0U和S1U

Survivor0和Survivor1区域的当前使用情况,以KB为单位。

EC和EU

以KB为单位显示Eden空间的当前大小和使用情况。

注:EU大小正在增加,一旦超过EC,执行minor GC。

OC和OU

以KB为单位显示年老代的当前大小和当前使用情况。

PC和PU

Perm Gen的当前大小和当前使用情况,以KB为单位。

YGC和YGCT

YGC列显示年轻代发生的GC的次数。YGCT列显示年轻代的GC操作的累计时间。

注:两个值都是在同一个行中增加的。

FGC和FGCT

FGC列显示发生的Full GC的数量。FGCT列显示完整GC操作的累计时间。

GCT

GC操作的总累计时间。

注:YGCT和FGCT值的总和。