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

Wesley13
• 阅读 1006

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

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

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

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java的内存机制
Java把内存划分成两种:一种是栈内存,另一种是堆内存。 Heap(堆)Stack(栈)JVM中的功能内存数据区内存指令区存储数据对象实例基本数据类型,指令代码,常量,对象的引用地址堆中存储数据堆内存用来存放由new创建的对象和数组。 保存对象实例,实际上是保存对象实例的属性值,属性的类型和
Wesley13 Wesley13
3年前
JDK8中JVM堆内存划分
一:JVM中内存JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法存放本地暂时变量与线程中方法运行时候须要的引用对象地址。JVM全部的对象信息都存放在堆内存中。相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分不同的功能区块实现对堆内存中对象管理。堆内存不够最常见的错误就是OOM(OutOf
Stella981 Stella981
3年前
JVM堆栈
栈与堆都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存
Stella981 Stella981
3年前
JVM基本配置与调优
JVM基本配置与调优JVM调优,一般都是针对堆内存配置调优。如图:堆内存分新生代和老年代,新生代又划分为eden区、from区、to区。!(https://oscimg.oschina.net/oscnet/5b30ad2de1851315e10f5d9e0a57395208c.png)一、区域释义
Stella981 Stella981
3年前
JVM 调优
JVM堆内存分区堆:年轻代,老年代,持久代年轻代:Eden,Survivor1,Survivor2!一个性能较好的jvm参数配置以及jvm的简介(http://static.oschina.net/uploads/img/201601/13172230_Pd5L.jpg)GC新生代GC(Mino
Stella981 Stella981
3年前
JVM 面试
1、内存模型以及分区,需要详细到每个区放什么。通俗的说,Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在Java虚拟机启动时创建,非堆内存(NonheapMemory)是在JVM堆之外的内存。简单来说,堆是Java代码可及的内
Wesley13 Wesley13
3年前
Java中的OutOfMemoryError的各种情况及解决和JVM内存结构
在JVM中内存一共有3种:Heap(堆内存),NonHeap(非堆内存)\3\和Native(本地内存)。\1\堆内存是运行时分配所有类实例和数组的一块内存区域。非堆内存包含方法区和JVM内部处理或优化所需的内存,存放有类结构(如运行时常量池、字段及方法结构,以及方法和构造函数代码)。本地内存是由操作系统管理的虚拟内存。当一个应用内存不足时
Stella981 Stella981
3年前
JVM 参数学习
一、JVM1、JVM产生GC的位置Eden(新生代)MinorGC算法(复制)Oldtenure(老年代) Major(Full)GC(整理压缩)算法2、JVM堆(Heap)内存大小参数\Xmn新生代8:1:1比例\Xms设置初始化堆内存大小 \Xmx设置堆内存最大大小 产生java.lang.
Stella981 Stella981
3年前
JVM复习
在复习Java内存机制的过程中有一些新问题,自问自答,做个记录。新生代是java堆内存的一部分。堆内存分新生代和老生代两大块,也有把堆内存分为新生代老生代永久代(持久代)三块的说法。(不过这种说法应该逐渐被淘汰,因为从java7开始永久代就已经被移除了。)新生代继续细分,可以划分出Eden,SurvivorFrom,SurvivorTo三块,Ed