前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM堆空间的新生代为什么要有两个survivor区域

JVM堆空间的新生代为什么要有两个survivor区域

作者头像
鳄鱼儿
发布2024-05-22 08:58:18
740
发布2024-05-22 08:58:18
举报
文章被收录于专栏:鳄鱼儿的技术分享

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

🍀JVM堆

Java堆(Java Heap)是JVM所管理的最大内存区域,也是所有线程共享的一块区域,在JVM启动时创建。

此内存区域存放的都是对象的实例和数组。JVM规范中说到:”所有的对象实例以及数组都要在堆上分配”。

Java堆是垃圾回收器管理的主要区域,百分之九十九的垃圾回收发生在Java堆,另外百分之一发生在方法区,因此又称之为”GC堆”。根据JVM规范规定的内容,Java堆可以处于物理上不连续的内存空间中。

当前JVM对于堆的垃圾回收,采用分代收集的策略。根据堆中对象的存活周期将堆内存分为新生代老年代。在新生代中,每次垃圾回收都有大批对象被回收,只有少量存活。少量存活的对象存活年龄足够后会进入老年代,而老年代中的对象存活率高。

这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

了解了JVM堆内存区域划分后,再来看看新生代所采用的垃圾回收算法————复制算法。

🍀复制算法

复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

新生代区域又可以分为 Eden和Survivor区域,Survivor区域又被分为To Survivor和From Survivor区域。

☘️如果没有 survior 区会怎么样?

如果没有 Survivor,Eden 区每进行一次 Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发 Full GC。

老年代的内存空间远大于新生代,进行一次Full GC 消耗的时间比 Minor GC 长得多。你也许会问,执行时间长有什么坏处?频发的 Full GC 消耗的时间是非常可观的,这一点会影响大型程序的执行和响应速度,更不要说某些连接会因为超时发生连接错误了。

☘️结论

Survivor 的存在意义,就是减少被送到老年代的对象,进而减少 Full GC 的发生,Survivor 的预筛选保证,只有经历 16 次 Minor GC 还能在新生代中存活的对象,才会被送到老年代。

☘️为什么有一个 survior 区不可以?

假设现在只有一个 survivor 区,我们来模拟一下流程: 刚刚新建的对象在 Eden 中,一旦 Eden 满了,触发一次 Minor GC,Eden中的存活对象就会被移动到 Survivor 区。这样继续循环下去,下一次 Eden 满了的时候,问题来了,此时进行 Minor GC,Eden 和 Survivor 各有一些存活对象,如果此时把 Eden 区的存活对象硬放到 Survivor 区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。

这里解释一下为什么会导致内存碎片化,按道理来说,只要每次将 Eden 区存活的对象按顺序跟在 survivor 区后面就好了呀,survivor 区也没有内存碎片。

其实不是这样的,第二次垃圾回收时,会先回收 Eden 和 survivor 两个区:具体过程先将 eden 区存活对象放在 survivor 区,然后回收掉两个区的对象,回收之后 survivor 区就会出现内存碎片

因为 survivor 区对象不会按顺序 si 掉,复制的时候 si 的对象也占空间,所以复制算法回收完,survivor 有碎片空间。

☘️两个 survivor 区的回收流程

刚刚新建的对象在 eden 中,经历一次 Minor GC,eden 中的存活对象就会被移动到第一块 survivor S0,eden 被清空;

等 eden 区再满了,就再触发一次 Minor GC,eden 和 S0 中的存活对象又会被复制送入第二块 survivor space S1(这个过程非常重要,因为这种复制算法保证了 S1 中来自 S0 和 eden 两部分的存活对象按顺序放置,占用连续的内存空间,避免了碎片化的发生),然后 S0 和 eden 被清空,

继续往 eden 区里放新生对象,eden 再满之后,S0 与 S1 交换角色,eden 和 S1 的存活对象被复制到 S0,如此循环往复。如果对象的复制次数达到16次,该对象就会被送到老年代中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🍀JVM堆
  • 🍀复制算法
    • ☘️如果没有 survior 区会怎么样?
      • ☘️结论
        • ☘️为什么有一个 survior 区不可以?
          • ☘️两个 survivor 区的回收流程
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档