那么,在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区是经过权衡之后的最佳方案。

JVM内存分配中为什么需要两个Survivor区域(转载)相关推荐

  1. Android性能调优篇之探索JVM内存分配

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  2. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  3. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  4. JVM内存分配与垃圾回收

        其实已经有很多大牛在这方面做了很好的介绍,我在这篇文章里讲下我自己的一些理解,受限于我的认知水平,可能不一定正确,请自我甄别. JVM的GC自动垃圾回收器是JAVA的一大特色,垃圾回收器要解决 ...

  5. 一个可以参考的JVM内存分配

    下面是java命令有关JVM内存分配的参数 JAVA_MEM_OPTS="" BITS=`java -version 2>&1 | grep -i 64-bit` i ...

  6. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码

    构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...

  7. Oracle内存分配中的子池(Subpool)--ORA-04031

    Oracle内存分配中的子池(Subpool)--ORA-04031 在 Oracle 9i 和之后的版本,共享池可以被划分为子池.每个子池是一个小号的共享池,有它自己的空闲列表,内存结构条目,和LR ...

  8. 深入理解JVM内存分配策略

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 Don't blame people for disappointing ...

  9. C:谈谈内存分配中的(.data)段和(.bss)段的区别?为什么要分.data段和.bss段?

    区别: .data段: 存放已初始化的全局变量.在编译器编译的时候,会给已初始化的数据分配内存空间,数据保存在目标文件中. .bss段: (bss是英文Block Started by Symbol的 ...

  10. CPU中的“程序计数器”和JVM内存模型中的“程序计数器”

    在理解JVM内存模型中的"程序计数器"时,可能会与CPU中的"程序计数器"混淆. CPU中的"程序计数器"属于硬件层面,如下图中的PC: J ...

最新文章

  1. Linux学习(linux就该这么学习)8.1
  2. “Python来玩微信跳一跳”教程(问题总结)
  3. vue安装教程及简介
  4. python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary
  5. 怎么对MySQL数据库操作大数据?这里有思路
  6. 数据结构:树(Tree)【详解】
  7. Chromecast 播放电脑本地视频
  8. 详解程序化交易、量化交易、高频交易、算法交易、各是什么意思?
  9. 我国台湾地区智慧城市建设的实践与启示
  10. 所谓键位冲突和无冲突的各种原理
  11. 【Linux】SIGCHLD信号
  12. 非递归式查找树形数据
  13. 周报8.22-8.28
  14. 2017.9.16队内互测——老年组Day1
  15. 单总线协议(1—wire)
  16. 我的世界服务器物品修改器,ReadyEditor全备编辑————基于箱子菜单的物品编辑器[1.14+]...
  17. 微信小程序开发之——个人中心-介绍(1)
  18. P2P在NAT和防火墙上的穿透
  19. vo2dto使用指南
  20. BugkuCTF——WEB(1)

热门文章

  1. 小程序、uniapp实现订单列表倒计时功能
  2. qq录屏快捷键大全,玩转录制就这么简单(干货)
  3. 计算机停电组态丢失,DCS正确停电和上电的步骤
  4. CAS:1221256-52-5 (2S)-2-氨基-2-甲基-9-癸烯酸 (2R)-2-Amino-2-methyl-9-decenoic acid
  5. 汉中90后小伙在四川凉山火灾中牺牲,本打算明年结婚
  6. 网站推广优化教程100条【SEO,网站关键字优化,怎么优化网站,如何优化网站关键字】...
  7. 特种化妆品成分的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 一位iOS教育类应用开发者是如何赚到60多万美元?
  9. 困在时间里的人——2023全国高考甲卷作文
  10. 项目经理的五懂、八会、七查、三知、两管、一分析