【java面试100问】67 为什么垃圾回收要分Eden区和Survior区?

文摘   2024-12-30 08:20   天津  

 

首先,我们来了解一下Java堆内存的基本结构。

Java堆内存被划分为新生代和老年代。

新生代主要用于存储新创建的对象,而老年代则用于存储生命周期较长的对象。

新生代又被进一步划分为Eden区、From Survivor区(也称为S0区)和To Survivor区(也称为S1区)。

为什么需要分Eden区和Survivor区?

  1. 1. 提高垃圾回收效率
  • • 新生代中的对象大多生命周期较短,很多对象在创建后不久就会变为垃圾。

因此,将新创建的对象首先分配在Eden区,当Eden区满时,触发一次Minor GC(新生代垃圾回收)。

  • • 在Minor GC过程中,Eden区中的存活对象会被复制到Survivor区,而大部分不再存活的对象会被清理掉。

这样,通过复制少量存活对象即可完成回收,大大提高了垃圾回收的效率。

  1. 2. 减少内存碎片化
  • • 如果没有Survivor区,每次Minor GC后存活的对象都会被直接送到老年代。

这样,老年代很快就会被填满,导致触发Major GC(老年代垃圾回收),而Major GC的回收时间通常比Minor GC长得多,对程序性能影响较大。

  • • Survivor区的存在,通过交替存放存活对象,保证了每次复制时对象都占用连续的内存空间,从而避免了内存碎片化的发生。
  1. 3. 逐步晋升机制
  • • 对象在Survivor区中每熬过一次Minor GC,其年龄就会增加1岁。

当年龄达到一定程度(默认是15岁)时,对象才会被晋升到老年代。

  • • 这种逐步晋升的机制有助于过滤掉生命周期较短的对象,将生命周期较长的对象才转移到老年代,从而减少了老年代的垃圾回收压力。

示例讲解

假设我们有一个Java应用程序,它不断地创建和销毁大量对象。

这些对象大多生命周期很短,只有少数对象会存活较长时间。

  • • 对象创建:新创建的对象首先被分配到Eden区。
  • • 第一次Minor GC:当Eden区满时,触发一次Minor GC。

Eden区中的存活对象被复制到Survivor区(假设是S0区),而不再存活的对象被清理掉。

  • • 第二次Minor GC:当Eden区再次满时,触发第二次Minor GC。

这次,Eden区和S0区中的存活对象被复制到另一个Survivor区(S1区),而Eden区和S0区被清空。

  • • 对象晋升:对象在Survivor区中每熬过一次Minor GC,其年龄就会增加。

当年龄达到15岁时,对象会被晋升到老年代。

通过这个过程,我们可以看到Eden区和Survivor区在垃圾回收中起到了关键作用。

它们不仅提高了垃圾回收的效率,还减少了内存碎片化,并通过逐步晋升机制有效地管理了对象的生命周期。

总的来说,Eden区和Survivor区的划分是Java垃圾回收机制中的一项重要设计,它们共同协作,使得Java应用程序能够更高效地管理和回收内存资源。



希望文章能给大家带来点技术收获。也希望大家能够点赞收藏转发,让知识成为大家的财富。你的支持,是我最大的动力!

  

你诺喜欢,请点个关注


大家可以发送消息:202412 

将获得15张高清IT技能图谱(12月有效)

进群的扫码,很有性价比奥!!!

也可以加个人VX,拉你进群(备注IT资源)


推荐文章:

不错的学习笔记 Spring Cloud Alibaba笔记


夏壹分享
系统化技术讲解,每日精进,为后端技术人员打造的知识充电站!
 最新文章