Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在Java中,堆被划分成两个不同的区域:新生代,老年代。新生代又被分为了三个区域:Eden,from survivor,to survivor。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存分配以及回收。
堆的内存模型大致为:
从图中可以看出: 堆大小=新生代+老年代。其中,堆的大小可以通过参数-Xms,-Xmx来指定。本人使用的是JDK1.6,以及涉及的JVM默认值均以该版本为准。
默认的,新生代与老年代的比例为1:2(该值可以通过参数-XX:NewRatio指定),即:新生代=1/3堆空间大小 老年代=2/3堆空间大小,其中新生代被细分为Eden何两个Survivor区域,这两个Survivor命名为from和to。默认比例 eden:from:to = 8:1:1,JVM每次只会使用Edem和一块survivor区域来为对象服务,所以无论何时,总有一块survivor是空闲的,因此新生代实际使用内存空间只有90%的新生代空间。
GC****堆
Java中的堆也是GC手机垃圾的主要区域,GC分为两种:minor GC和major GC (Full GC).
Minor GC 是发生在新生代的垃圾收集动作,所采用的是复制算法。
新生代几乎是所有Java对象出生的地方,即Java对象申请的内存以及存放都是在这个地方。Java中大部分对象通常不许长久存活,具有朝生夕灭的性质。
当一个对象被判定为死亡的时候,GC就有责任来回收这部分对象的内存空间,在经过一次minor GC后,如果对象还存活,并且能够被另外一块survivor区域所容纳(即from/to 有足够的内存空间来存储存活的对象),则使用复制算法将对象复制到空闲的survivor区域中,然后清理所使用过的Eden+from/to区域,并将这些存活对象年龄设置为1,以后对象在survivor区域熬过一次minor GC ,就将对象年龄+1,当对象年龄达到设置的值时(默认为15岁,可通过参数 -XX:MaxTenuringThreshold来设定),这些对象就会成为老年代。
但这也不是一定的,对于一些较大的对象(即需要分配一块较大的 连续内存空间)则是直接进入老年代。
Full GC 是发生在老年代的垃圾收集动作,所采用的是标记+清除算法。
堆内存中的老年代里面的对象几乎个个都是survivor区域中熬过来的,它们是不会那么容易死掉,因此Full GC 发生的次数不会有minor GC那么频繁,并且做因此Full GC要比进行因此 minor GC的时间更长,另外标记-清除算法收集垃圾的时候,会产生许多内存碎片,此后需要大对虾分配内存空间时,若没有足够的连续内存空间,则会触发一次GC收集动作。
GC****日志
public static void main(String[] args) {
Object obj = new Object();
System.gc();
System.out.println();
obj = new Object();
obj = new Object();
System.gc();
System.out.println();
}
设置 JVM 参数为 -XX:+PrintGCDetails,使得控制台能够显示 GC 相关的日志信息,执行上面代码,下面是其中一次执行的结果。
Minor GC每次 Minor GC 会清理年轻代的内存。
Major GC 是清理老年代。?????
Full GC 是清理整个堆空间—包括年轻代和老年代。
[GC (System.gc()) [PSYoungGen: 3932K->576K(76288K)] 3932K->584K(251392K), 0.0017435 secs] [Times: user =0.01 sys=0.00, real=0.00 secs]
解释:新生代在minorGC前的内存使用为3932K,GC后新生代内存使用576K,新生代总内存大小为76288K;minorGC前堆内存使用为3932K,GC后为584K,总的堆内存大小为251392K,minorGC的耗时时间为0.0017435secs。
[Full GC (System.gc()) [PSYoungGen: 576K->0K(76288K)] [ParOldGen: 8K->389K(175104K)] 584K->389K(251392 K), [Metaspace: 2710K->2710K(1056768K)], 0.0079609 secs]
解释:Full GC 首先清除新生代,老年代清理前8K,清理后389K,可用内存空间为175104K; 堆内存清除前为584K,清除后389K,堆可用空间251392K; Metaspace非堆空间的永久代。