注:本文转载于

http://blog.csdn.net/antony9118/article/details/51425581

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

survivor区的解释相关推荐

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

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

  2. 【JVM】survivor区的解释

    干货 那么,在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? 1 为什么要有Survivor区 先不去想为什么有两个Survivor区,第一个问题是,设置Survivor ...

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

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

  4. 为什么需要两个Survivor区?

    最大的好处就是解决了碎片化.也就是说为什么一个Survivor区不行?第一部分中,我们知道了必须设置Survivor区.假设现在只有一个Survivor区,我们来模拟一下流程: 刚刚新建的对象在Ede ...

  5. 年轻代为什么要设置两个Survivor区

    设置两个Survivor区最大的好处就是解决了碎片化. 为什么一个Survivor区不行?第一部分中,我们知道了必须设置Survivor区.假设现在只有一个survivor区,我们来模拟一下流程:  ...

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

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

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

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

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

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

  9. JVM内存新生代Eden区和Survivor区的比例是多少?

    JVM内存新生代Eden区和Survivor区的默认比例是8:1:1.其中,Eden区占用80%,Survivor区占用20%,并且划分为大小相同的两部分,这样划分的原因是为了解决内存碎片的问题.

最新文章

  1. stick footers布局
  2. JS是世界上最好的语言—— 使用Electron开发桌面应用(一)
  3. 关于LCD的分屏与切屏 Tearing effect
  4. 优化以insert语句导入数据的方式
  5. python新手入门英文词汇笔记(1-1)_Python新手入门英文词汇(1-1)
  6. 如何在ESX下抓取数据包
  7. HDU 3590 PP and QQ(反nim博弈,删边游戏)
  8. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜
  9. 论文浅尝 | 利用Lattice LSTM的最优中文命名实体识别方法
  10. spark学习-Spark算子Transformations和Action使用大全(Transformations章(二))
  11. springcloud -zuul(2-执行流程及源码)
  12. c语言常用单词表格,C语言常用单词
  13. struts2中struts.xml配置文件详解
  14. 【Fusion】mosek.fusion基本模型
  15. 第七课GUI练练表面功夫
  16. 互联网金融网络借贷系统架构
  17. TP—Link路由器进行WDS无线桥接设置方法
  18. DBeaver 环境配置
  19. Space Cloud updated Crack
  20. 部分特定领域的信息化检测管理要求和获认可机构目录

热门文章

  1. 牛老师考察の基础知识
  2. C++中4种方式把字符串和数字连接起来
  3. 关于ICache和DCache
  4. 《名师讲坛—Oracle开发实战经典》随书光盘视频教程
  5. java鼠标绘制,教您如何用JAVA程序实现鼠标绘图
  6. Adobe CS3在Windows server 2003中无法安装的解决方法
  7. 【英语:基础进阶_核心词汇扩充】E2.常见词后缀拓词
  8. 免费域名申请及免费DNS解析
  9. 立体视觉 之 刚体变换
  10. 莫道桑榆晚,为霞尚满天