专栏首页用户7890857的专栏面试官:为什么新生代内存需要有两个Survivor区?
原创

面试官:为什么新生代内存需要有两个Survivor区?

1 、Survivor存在的意义

先不去想为什么有两个Survivor区,先设想下Survivor区的意义在哪里?

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。这样老年代内存很快就被用完,触发Major GC。由于老年代的内存空间远大于新生代,所以进行一次Full GC消耗的时间比Minor GC长得多,这样就会导致系统执行缓慢卡顿,响应速度过慢,用户体验十分不好,更不要说某些连接会因为超时发生连接错误了。

那我们来想想在没有Survivor的情况下,有没有什么解决办法,可以避免上述情况:

  • 增加老年代内存
    • 好处是能够承担更多存活对象,降低GC频次
    • 缺点也是显而易见的,空间越大,发生GC所需要的时间更长
  • 减少老年代内存
    • 优点就是GC所需要的时间减少
    • 缺点就是GC频次增加

显而易见,没有Survivor的话,上述两种解决方案都不能从根本上解决问题。

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

2 、为什么要设置两个Survivor

设置两个Survivor区最大的好处就是解决了碎片化

为什么一个Survivor区不行?假设现在只有一个survivor区,我们来模拟一下流程:

Eden满了,触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区。继续循环下去,下一次Eden满了的时候进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化,严重影响系统性能。

顺理成章的,应该建立两块Survivor区,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。

S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。如果对象的复制次数达到16次,该对象就会被送到老年代中。

上述机制最大的好处就是,整个过程中,永远有一个survivor space是空的,另一个非空的survivor space无碎片。

最后打个广告,如果你觉得这篇文章对你有帮助,可以关注我的技术公众号【CodingCode】。你的关注和转发是对我最大的支持,O(∩_∩)O。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

关注作者,阅读全部精彩内容
登录 后参与评论
0 条评论

相关文章

  • 【117期】面试官:熟悉JVM吗?为什么新生代内存需要有两个Survivor区?

    来自:blog.csdn.net/antony9118/article/details/51425581

    良月柒
  • 为什么新生代内存需要有两个Survivor区?

    对于常见的GC算法,我们都应该知道,例如:标记清除算法、复制算法、标记整理算法等。标记清除算法由于回收之后存在大量的内存碎片,存在效率和空间问题!为了解决效率问...

    Java后端技术
  • JVM(六)为什么新生代有两个Survivor分区?

    本文会使用排除法的手段,来讲解新生代的区域划分,从而让读者能够更清晰的理解分代回收器的原理,在开始之前我们先来整体认识一下分代收集器。

    Java中文社群-磊哥
  • 【面试必备】小伙伴栽在了JVM的内存分配策略。。。

    周末有小伙伴留言说上周面试时被问到内存分配策略的问题,但回答的不够理想,小伙伴说之前公号里看过这一块的文章的,当时看时很清楚,也知道各个策略是干嘛的,但面试时脑...

    Bug开发工程师
  • Java虚拟机面试题(2021最新版)

    我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的知识和面试经验,为将来进入更好的公司做好充分的准备!想让面试官在短短的几十分钟...

    Java程序猿
  • 详解jvm内存结构,java内存模型,java对象布局,别再搞混啦!

    有面试官会让你解释一下Java的内存模型,有些人解释对了,结果面试官说不对,应该是堆啊、栈啊、方法区什么的(遇到这种面试官,就是你装逼的时刻了..)

    Java宝典
  • JVM常见面试题解析

    总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。

    猿天地
  • 月薪30k的Java架构师JVM常见面试题解析

    在做程序员的路上经常会遇到的JVM一些经典面试题,今天给大家分享出我自己的解题思路,希望对大家有帮助,后续有空会持续更新。

    Java架构师进阶技术
  • 面试官,不要再问我“Java GC垃圾回收机制”了

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    程序新视界
  • 面试官,不要再问我“Java GC垃圾回收机制”了

    在上篇《JVM之内存结构详解》中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习。还记得JVM中堆的结构图吗?

    沉默王二
  • 面试官问我:Object o = new Object() 占用了多少个字节?

    最近马师傅火的不要不要的,虽然没有抢到耗子尾汁的商标注册权,但是必须得蹭一波马师傅的热度,下面就是闪电五连鞭的教学环节,你准备好了吗!

    Java宝典
  • 面试官问我:Object o = new Object() 占用了多少个字节?

    这张图其实就能完整的说明一个对象的创建过程到底发生了什么,很多朋友可能一下看不懂,那么我们就跟着左上角的一步一步来:

    程序IT圈
  • JVM笔记-内存分配策略

    Java 技术体系的自动内存管理,最根本的目标就是解决两个问题:「自动化」地给对象分配、回收内存空间。

    WriteOnRead
  • 记一次Elasticsearch优化总结

    项目中的服务集成了springboot-admin做服务监控,最近一直收到邮件告警,提示es出错。错误信息如下:

    kinnylee
  • 面试总结

    周五去了一趟深圳某互联网金融面试,很遗憾吧,没过,听到没过的时候心都碎了,毕竟还是很想去这家公司的,之后还不要脸的问了“能不能再聊聊”,下楼之后,被二面的经理叫...

    Zephery
  • JVM真香系列:堆内存详解

    在 JVM中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。

    田维常

扫码关注云+社区

领取腾讯云代金券