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

一、为什么需要Survivor区?

带着这个问题,我们假设一下,如果没有Survivor区,新生代只有Eden区。

当Eden区装满后,Minor GC进行垃圾回收,幸存的对象会直接放入老年代,可以想到,要不了多久老年代就会装满,便会进行Major GC且连带Minor GC也就是Full GC,每次Full GC都会消耗大量的时间。也许你会问,执行时间长有什么问题?频发的Full GC会消耗大量的时间,会影响程序的执行与响应速度,导致连接超时等等一系列问题。所以,会出现老年代频发Full GC而严重影响效率的问题

那么,如果不依靠Survivor区,我们应该如何解决老年代频发Full GC的问题呢?

方案 优点 缺点
增大老年代内存空间 更多对象才会填满老年代,降低Full GC频率 每次GC消耗更长的时间
减小老年代内存空间 Full GC执行时间减少 Full GC频率增加

由此可见,没有Survivor区无法从根本解决问题。

结论:Survivor具有预筛选保证,只有对象到一定岁数才会送往老年代,Survivor区可以减少被送到老年代的对象,进而减少Full GC发生。

二、为什么需要两个Survivor区?

可以知道,新生代使用复制回收算法,我们设想一下只有一个Survivor区会发生什么情况。

当Eden区填满后,Minor GC进行垃圾回收,幸存的对象会移动到Survivor区,这样循环往复。此时,Survivor区被装满了,也会进行Minor GC,将一些对象kill掉,幸存的对象只能保存在原来的位置,这样就会出现大量的内存碎片(被占用内存不连续)

内存碎片化是严重影响性能的,可以设想当有一个稍大一点的对象从Eden区存活转入Survivor区,发现空闲内存断断续续,没有他能落脚的地方,就只能直接存到老年代了,如此反复,老年代会出现我们第一部分的问题。打个比方:我们出去郊游,一些吃的罐头,玩的玩具随便放在包里,最后发现最主要的折叠帐篷放不进去了,只好手拿着到处溜达,非常不方便且影响心情。

最后,如果有两个Survivor区,便可以保证一个为空,另一个是非空且无碎片保存的

转载于:https://juejin.im/post/5c4405d4e51d4552447430a5

深入理解JVM——(三)为什么JVM新生代需要两个Survivor区相关推荐

  1. JVM内存结构--新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数

    转自http://www.cnblogs.com/duanxz/p/6076662.html 一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以, ...

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

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

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

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

  4. 为什么新生代内存需要有两个Survivor区

    在我的上一篇博客中,介绍了JVM堆内存的结构以及在堆中进行的GC机制,链接是浅谈JAVA GC机制与性能优化 那么,在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? 1 ...

  5. java eden s0 s1_JVM内存结构--新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数...

    一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  6. 新生代Eden与两个Survivor区的解释

    文章出处:http://ifeve.com/jvm-yong-generation/ 聊聊JVM的年轻代 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分 ...

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

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

  8. java 新生代中的Eden与两个Survivor区详解

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  9. 为什么新生代有两个survivor?

    利用两个survivor达到新生代无碎片的目的: Eden Survivor1 Survivor2 S1.程序初始化,新生代的三个空间均为空 S2.Eden被分配的新对象占满,触发第一次Minor G ...

最新文章

  1. 数学分析原理 定理 6.4
  2. 提交响应后无法调用sendredirect_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP...
  3. Windows下VS2013 C++编译测试faster-rcnn
  4. 调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试
  5. Command line is too long. Shorten command line for Doc.generateAsciiDocs or
  6. 为何Google、微软、华为将亿级源代码放一个仓库?
  7. ArcGIS Server 10.1发布数据源为ArcSDE(直连)的MXD【转】
  8. paip.java 注解的详细使用代码
  9. 参考文献标号字体_论文格式要求及字体大小
  10. 开发者需要什么样的技术社区?
  11. BZOJ 1050 HAOI2006 旅行comf
  12. STM32单片机:定时器TIM输出PWM波
  13. C盘User下的中文名字修改为英文遇到的问题
  14. mac m1 tensorflow环境安装问题
  15. NUMA与英特尔下一代Xeon处理器学习心得(2)
  16. 走出腾讯和阿里,那些离开大厂的中年人,过得怎么样?
  17. Android手机应用UI设计的10个建议
  18. mysql 补丁 patch6_暗黑3测试 Patch6 补丁更新列表
  19. 用过很多思维导图软件,最好用的还是它
  20. 怎么安装winubuntu双系统_win7系统电脑怎么利用ubuntu安装双系统,win7电脑安装双系统的方法...

热门文章

  1. 2017瞻博网络年会隆重召开 重点发力电信和OTT两大市场
  2. java-mybaits-00101-基础安装配制
  3. 域名买了,DNS解析怎么选?一键按需定制解析服务不是梦!
  4. Debian8 远程登录Permission Denied,please try again
  5. 风清杨之Oracle的安装与说明
  6. [IE技巧] 禁止/允许显示网页上Flash的小插件
  7. pgpool-II的性能缺陷(二)
  8. C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用...
  9. 《C和指针》一1.5 警告的总结
  10. 修改CentOS7网卡名称为传统名称eth0格式(20170711更新)