在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?

1 为什么要有Survivor区

先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里?

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。你也许会问,执行时间长有什么坏处?频发的Full GC消耗的时间是非常可观的,这一点会影响大型程序的执行和响应速度,更不要说某些连接会因为超时发生连接错误了。

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

方案 优点 缺点
增加老年代空间 更多存活对象才能填满老年代。降低Full GC频率 随着老年代空间加大,一旦发生Full GC,执行所需要的时间更长
减少老年代空间 Full GC所需时间减少 老年代很快被存活对象填满,Full GC频率增加

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

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

2 为什么要设置两个Survivor区

设置两个Survivor区最大的好处就是解决了碎片化,下面我们来分析一下。

为什么一个Survivor区不行?第一部分中,我们知道了必须设置Survivor区。假设现在只有一个survivor区,我们来模拟一下流程:
刚刚新建的对象在Eden中,一旦Eden满了,触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区。这样继续循环下去,下一次Eden满了的时候,问题来了,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化
我绘制了一幅图来表明这个过程。其中色块代表对象,白色框分别代表Eden区(大)和Survivor区(小)。Eden区理所当然大一些,否则新建对象很快就导致Eden区满,进而触发Minor GC,有悖于初衷。

碎片化带来的风险是极大的,严重影响JAVA程序的性能。堆空间被散布的对象占据不连续的内存,最直接的结果就是,堆中没有足够大的连续内存空间,接下去如果程序需要给一个内存需求很大的对象分配内存。。。画面太美不敢看。。。这就好比我们爬山的时候,背包里所有东西紧挨着放,最后就可能省出一块完整的空间放相机。如果每件行李之间隔一点空隙乱放,很可能最后就要一路把相机挂在脖子上了。

那么,顺理成章的,应该建立两块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无碎片

那么,Survivor为什么不分更多块呢?比方说分成三个、四个、五个?显然,如果Survivor区再细分下去,每一块的空间就会比较小,很容易导致Survivor区满,因此,我认为两块Survivor区是经过权衡之后的最佳方案。

说明
本人水平有限,不当之处希望各位高手指正。另外,文中的插图都是我自己在word的smart art中绘制的,看起来不精致请见谅。
如有转载请注明出处
http://blog.csdn.net/antony9118/article/details/51425581

为什么只需要一个eden而需要两个survivor?相关推荐

  1. 新生代Eden区、两个Survivor区及老年代的关系

    偶然想起JVM年轻代中Eden区和两个Survivor的比例,就想根据自己的理解和大家探讨一下为什么要配成8 :1 :1的比例. 一.JVM堆分代 1.JVM堆被分为了年轻代和老年代.年轻代的GC过程 ...

  2. 深入理解JVM——(三)为什么JVM新生代需要两个Survivor区

    经过了JVM区域的学习,我们知道在堆中新生代具有一个Eden区和两个Survivor区,这里就有疑问了,为什么需要Survivor区和为什么需要两个Survivor区?带着疑问我们思考一下. 一.为什 ...

  3. 【小记】为什么jvm的新生代要分为一个Eden和两个Survivor

    2021-03-12 现在的JVM的新生代内存中,除了Eden区,还有两个Survivor区.那为什么要这样设置呢? 这和新生代的垃圾回收算法是息息相关的. 复制算法 复制算法是新生代的垃圾收集收集算 ...

  4. JVM(六)为什么新生代有两个Survivor分区?

    本文会使用排除法的手段,来讲解新生代的区域划分,从而让读者能够更清晰的理解分代回收器的原理,在开始之前我们先来整体认识一下分代收集器. 分代收集器会把内存空间分为:老生代和新生代两个区域,而新生代又会 ...

  5. JVM(六)为什么新生代有两个Survivor分区? 1

    本文会使用排除法的手段,来讲解新生代的区域划分,从而让读者能够更清晰的理解分代回收器的原理,在开始之前我们先来整体认识一下分代收集器. 分代收集器会把内存空间分为:老生代和新生代两个区域,而新生代又会 ...

  6. [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由

    [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由 两个页面 pc端布局和交互行为跟移动端不一样, 两个页面反而更好维护 个人简介 ...

  7. 又一面试题:一个猎人带着一只狼,一个女人带着两个小女孩,一个男人带着两个小男孩,他们要渡船过河。...

    一个猎人带着一只狼,一个女人带着两个小女孩,一个男人带着两个小男孩,他们要渡船过河.  猎人离开狼,狼会把所有的人吃掉  女人离开两个小女孩,男孩会打死两个小女孩  男人离开两个小男孩,女人要把两个小 ...

  8. 解决Excel 2010打开两个以上文件时,总只显示一个窗口

    用Excel 2010打开两个以上文件时,总只显示一个窗口. 解决方法,打开注册表编辑器,(点运行,输入regedit)定位到 HKEY_CLASSES_ROOT\Excel.Sheet.12\she ...

  9. 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。

    一个数组中只有两个数字是出现一次,其他所有数字都出现了两次.编写一个函数找出这两个只出现一次的数字. 1.代码编写 2.结果 1.代码编写 代码如下(示例): #define _CRT_SECURE_ ...

最新文章

  1. 如何定制化SAP Spartacus的购物车图标
  2. jwt php tp5,TP5框架中使用JWT的方法示例
  3. html页面上使用vlc,【JSJQuery】使用VLC在html中播放rtsp视频
  4. Recyclerview单选和多选
  5. DNS 系统解析过程概述
  6. C++/mfc错误总结
  7. 2011 5月13日
  8. node.js源码安装
  9. PFC2D学习笔记——柔性簇(cluster)生成
  10. ImportError: Unable to import required dependencies: pytz: No module named ‘pytz‘
  11. python写法教程_Python的表达式写法
  12. 身为管理者必须会讲的68个小故事
  13. 计算机网络中的广播啥意思,卫星IP数据广播是什么意思?
  14. 智能客服搭建(1) - MRCP Server 搭建
  15. html文字发光效果,css文字发光效果
  16. 科普小时代---笔记本连接无线受限
  17. Apache Pulsar PMC 成员翟佳:开源和 Apache 社区是个带有魔法的宝库
  18. picker使用以及注意事项
  19. 【仿真建模】第四课:AnyLogic入门基础课程 - 轨道交通仿真入门讲解
  20. zencart1.55stripe信用卡内嵌支付获取卡号

热门文章

  1. Hadoop+eclipse运行MapReduce程序
  2. 横空出世,席卷互联网--评微软等公司数据结构+算法面试100题
  3. MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码
  4. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
  5. 修改DEDECMS文章标题长度,解决DEDECMS文章标题显示不全
  6. C/C++ 读取配置(config)文件 开源库(libconfig)
  7. OpenCV图像处理使用笔记(六)——图像滤波
  8. 对F-score的理解
  9. 一个数里有那些约数用c++怎么做_如何从一堆数里找出哪几个数相加等于你要的值?...
  10. makefile 基础用法