Java虚拟机堆内存(新生代)

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非堆空间的永久代。

c12054e4bde4bd004fc15d36cd1caa5fd61.jpg

 

0f49dbb42478676ab8b2284434b6415638e.jpg

 

转载于:https://my.oschina.net/ttscjr/blog/1941491

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值