JVM堆的相关知识点,及常见面试题

HotSpot JVM堆

从GC的角度可以将HotSpot JVM堆分为新生代、老年代。其中新生代默认占1/3堆空间,老年代默认占2/3堆空间。新生代又分为Eden 区、SurvivorFrom 区和SurvivorTo 区,Eden区默认占8/10新生代空间,SurvivorFrom区和SurvivorTo区默认分别占1/10新生代空间,如图所示。

添加图片注释,不超过 140 字(可选)

1. 新生代:Eden区、SurvivorTo区和SurvivorFrom区

JVM新创建的对象(除大对象外)会被存放在新生代,默认占1/3堆内存空间。由于JVM会频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。新生代又分为Eden区、SurvivorTo区和SurvivorFrom区,如下所述。

(1)Eden区:Java新创建的对象首先会被存放在Eden区,如果新创建的对象属于大对象,则直接将其分配到老年代。大对象的定义与具体的 JVM版本、堆大小和垃圾回收策略有关,一般为2KB~128KB,可通过XX:PretenureSizeThreshold设置其大小。在Eden区的内存空间不足时会触发MinorGC,对新生代进行一次垃圾回收。

(2)SurvivorTo区:保留上次MinorGC时的幸存者。

(3)SurvivorFrom区:将上次MinorGC时的幸存者作为这次MinorGC的被扫描者。

新生代的GC过程叫作MinorGC,采用复制算法实现,具体过程如下。

(1)把在Eden区和SurvivorFrom区中存活的对象复制到SurvivorTo区。如果某对象的年龄达到老年代的标准(对象晋升老年代的标准由XX:MaxTenuringThreshold设置,默认为15),则将其复制到老年代,同时把这些对象的年龄加1;如果SurvivorTo区的内存空间不够,则也直接将其复制到老年代;如果对象属于大对象(大小为2KB~128KB的对象属于大对象,例如通过XX:PretenureSizeThreshold=2097152设置大对象为 2MB,1024×1024×2byte=2097152byte=2MB),则也直接将其复制到老年代。

(2)清空Eden区和SurvivorFrom区中的对象。

(3)将SurvivorTo区和SurvivorFrom区互换,原来的SurvivorTo区成为下一次GC时的SurvivorFrom区。

2. 老年代

老年代主要存放长生命周期的对象和大对象。老年代的GC过程叫作MajorGC。在老年代,对象比较稳定,MajorGC不会被频繁触发。在进行MajorGC前,JVM会进行一次MinorGC,在MinorGC后对象仍然出现在老年代且当老年代空间不足或无法找到足够大的连续内存空间分配给新创建的大对象时,会触发MajorGC进行垃圾回收,释放JVM的内存空间。

MajorGC采用标记清除算法,该算法首先会扫描所有对象并标记存活的对象,然后回收未被标记的对象,并释放内存空间。因为要先扫描老年代的所有对象再回收,所以MajorGC的耗时较长。MajorGC的标记清除算法容易产生内存碎片。在老年代没有内存空间可分配时,会抛出Out Of Memory异常。


相关面试题

(1)JVM的堆内存结构由哪几部分组成?★★★★★

(2)MinorGC的过程是怎样的?★★★★★

(3)请描述在什么情况下,对象会从新生代进入老年代?★★★★☆

(4)Minor GC和Major GC的区别是什么?★★★☆☆


内容摘自《Offer来了(第2版)》。这是一本超强Java面试宝典、面霸手册,超详尽的Java知识点速查,Java面试题库,帮你深入理解Java核心技术,对Java知识点查漏补缺,可作为工具书使用。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章