JVM内存分配_---JVM在进行内存回收时,是如何识别哪些对象应该放在新生代,哪些对象应该放在老年代的?

首先,了解这一过程,必须对堆的内存模型进行了解。先看下图:
这里写图片描述
JVM将堆内存分为新生代(1/3的堆内存)和老年代(2/3的堆内存)两个区域。
新生代区域一般采用复制算法对内存进行回收。
老年代区域则采用标记清除算法和标记压缩算法对内存进行回收。
JVM为了便于内存管理,又将新生代分为3个区域:Eden空间、From空间和To空间,From和To空间也称为Survivor空间,用来存放没有被Minor GC 回收的对象。其中from和to空间可以看做用来执行复制算法操作的两块大小相等的内存区域(可以互相转换)。
好了了解了堆内存的模型之后,来说以下JVM是如何识别新生代和老年代对象的。

首先,JVM为每一个对象定义一个对象年龄计数器。在分配对象时,优先将对象
分配到新生代的Eden空间。当对象经过第一次Minor GC后仍然存活,且能被Survivor(To、From空间)容纳的话,就会被移动到Survivor空间中,并将对象年龄设定为1,之后,对象在Survivor区域每经历过一次Minor GC后,对象年龄计数器就加1,当对象年龄计数器达到15岁(默认年龄,也可通过参数设置)时,如果对象仍然存活,就会晋升为老年代中。

虚拟机并不是永远要求对象的年龄达到最大年龄才能晋升到老年代,对象还可以通过另外一种方式晋升到老年代,即如果对象在Survivor空间中,相同年龄的所有对象的内存大小大于Survivor空间的一半时(无法执行复制操作了),年龄大于或等于该年龄的对象就可以直接进入老年代。

阅读更多

没有更多推荐了,返回首页