首页 - 新闻 - 【第117期】面试官:你熟悉JVM吗?为什么新一代内存需要有两个Survivor区?

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

2023-10-05 02:58
2022年5月17日下午3:50 • 面试问题 • 阅读3 点击上方“Java面试题精选”,关注公众号 面试时画图,查漏补缺 >>番外:往期面试题,10个为单位放在这个公众号菜单栏->面试题,有需要的欢迎阅读 阶段总结合集:++小旗实现、百道面试题总结++ JVM的新一代内存中,为什么除了Eden区之外,还有两个Survivor区呢? 1 为什么要有Survivor区? 我们先别想为什么有两个Survivor专区。第一个问题,设立Survivor园区的意义是什么? 如果没有Future,Eden区每次进行Minor GC时,存活的对象都会被发送到老年代。老年代很快被填满,触发Major GC(因为Major GC通常伴随着Minor GC,所以也可以视为触发了Full GC)。 老年代的内存空间比新生代大很多,Full GC 的时间也比 Minor GC 长很多。你可能会问,执行时间长有什么坏处呢?频繁的Full GC所消耗的时间是非常可观的,会影响大型程序的执行和响应速度,更何况有些连接会因为超时而导致连接错误。 好吧,我们想一下,如果没有Survivor,有没有什么办法可以避免上述情况: 显然,如果没有Survivor,上述两种方案都不能从根本上解决问题。 我们可以得到第一个结论:Survivor存在的意义就是减少发送到老年代的对象,从而减少Full GC的发生。Survivor的预筛选保证了只有经历过16次Minor GC的人才仍然能够在新一代中生存。该对象将被发送到老年代。上期:100道面试题汇总 2 为什么有两个Survivor专区? 设立两个Survivor专区最大的好处就是解决了碎片化问题。下面我们就来分析一下。 Survivor区为何行不通?在第一部分中,我们了解到必须设立Survivor专区。假设只有一个survivor区,我们来模拟一下这个过程: 新创建的对象位于 Eden 中。一旦Eden满了,就会触发Minor GC,Eden中幸存的对象会被移动到Survivor区。这样循环下去。下次伊甸园满了时,就会出现问题。此时,会进行Minor GC。伊甸园和Survivor各有一些幸存的物品。如果此时将伊甸区中幸存的对象硬放到Survivor区中,显然,这会导致两部分对象所占用的内存不连续,从而导致内存碎片。我画了一张图来说明这个过程。色块代表物体,白框分别代表伊甸园区(大)和Survivor区(小)。 Eden区自然就大一些,否则新创建的对象会很快导致Eden区变满,从而触发Minor GC,这与初衷相悖了。 碎片带来的风险是巨大的,严重影响JAVA程序的性能。堆空间被分散的对象占用,这些对象占用不连续的内存。最直接的结果就是堆中没有足够的连续内存空间。接下来,如果程序需要给内存需求较大的对象分配内存。 。 。画面美得让人不忍直视。 。 。这就好比我们爬山的时候,把背包里的东西都挨得很近,最后才有可能为相机节省出完整的空间。如果每件行李之间都留有一点空间,那么您的相机可能会一直挂在脖子上。更多面试题欢迎关注公众号java面试题精选 那么,设立两个Survivor地区也就顺理成章了。新创建的对象位于 Eden 中。经过一次Minor GC后,Eden中的存活对象会被移动到第一个幸存者空间S0,Eden会被清除;等待伊甸园区域重新开放。当满了时,会再次触发Minor GC,将Eden和S0中的存活对象复制并发送到第二个幸存者空间S1(这个过程非常重要,因为这个复制算法保证了S1中的部分从S0而 Eden 则幸存的对象占用连续的内存空间以避免碎片)。 S0和Eden被清除,然后S0和S1在下一轮中交换角色,依此类推。如果一个对象的副本次数达到16次,该对象就会被发送到老年代。下图中各部分的含义与上图相同,所以不再添加注释。 上述机制的最大优点是,在整个过程中,始终有一个survivor空间是空的,而另一个非空的survivor空间是没有碎片的。 那么Survivor为什么不把它分成更多的部分呢?比如分成三份、四份还是五份?显然,如果Survivor区进一步细分,每个街区的空间就会更小,很容易导致Survivor区爆满。所以我觉得两个Survivor区是权衡的。最佳解决方案。 阐明 本人水平有限,如有不当之处还望专家指正。另外,文章中的插图都是我用word的smart art绘制的。请原谅我看起来不够精致。 来源:www.gsm-guard.net/antony9118/article/details/51425581 而不是在网上搜索问题?还不赶快关注我们吧~版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。 本文由斑马博客整理。本文链接为:https://www.gsm-guard.net/index.php/post/7042.html