分代收集器会把内存空间分为:老年代和新生代两个区域,而新生代又会分为:Eden区和两个Survivor区(From Survivor、To Survivor)。

可以看出,Eden区和Survivor分区的默认比例是8:1:1。这个值可以通过:-XX:SurvivorRatio设定,默认值,:-XX:SurvivorRatio=8。

新生代和老年代的默认情况下内存占比是1:2,该值可以通过:-XX:NewRatio来设定。

1.为什么要有Survivor区

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

如果没有Survivor的情况下,如何避免Full GC的频繁发生呢。

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

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

为什么要设置两个Survivor区呢

设置两个Survivor区的最大好处就是解决了碎片化。
如果只有一个Surivor区:

刚刚新建的对象存放在Eden区,一旦Eden区满了,就会触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区。这样继续循环下去,下一次Eden满了的时候,问题来了,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。

碎片化带来的风险是极大的,严重影响Java程序的性能。堆空间被散布的对象占据不连续的内存,最直接的结果,就是堆中没有足够大的连续内存空间,接下去如果程序需要给一个内存需求很大的对象分配内存,那么就会需要整理空间。

因此,需要建立两块Survivor区,刚刚新建的对象存放在Eden区,经历过一次Minor GC后,Eden中的存活对象就会被移动到第一块的survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中存活的对象就会被复制送入到第二块的survivor space S1,避免了碎片化的发生。
S0和Eden被清空后,然后进行下一轮S0和S1交换角色,原S0变成S1,原S1变成S0。如此循环往复,当survivor区中有对象的复制次数达到16次,也就是16次 Minor GC都没有回收该对象,该对象就会被送到老年代。

上述机制的最大好处就是,整个过程中,永远有一个survivor是空的,另一个非空的survivor space没有碎片。

那么为什么survivor为什么不分更多块呢

如果Survivor区再细分的话,每一块的空间就会很小,很容易导致Survivor区满,而且两块的Survivor区,已经足够支持标记-复制算法的进行。应该是经过权衡之后的结果。
https://blog.csdn.net/antony9118/article/details/51425581

为什么新生代有两个Survivor分区相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. JVM 新生代为何需要两个 Survivor 空间?

    我们知道,目前主流的虚拟机实现都采用了分代收集的思想,把整个堆区划分为新生代和老年代:新生代又被划分成 Eden 空间. From Survivor 和 To Survivor 三块区域. 看书的时候 ...

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

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

最新文章

  1. 遍历Treeview每个节点并初始化(C#)
  2. 西湖大学鞠峰组招聘“污水处理”与“微生物组”方向博士后与科研助理
  3. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库
  4. 【android】安卓平台版本和API版本的对应关系
  5. mysql创建用户以及授权
  6. android缓存之Lrucache 和LinkedHashMap
  7. 4 关卡流 进阶_儿童桌游要不要鸡血的过关?关卡制儿童桌游介绍与方法论
  8. 11.14 mii-tool:管理网络接口的状态
  9. [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
  10. Java编程中的基本概念
  11. 硬核总结 9 个关于认证授权的常见问题!看看自己能回答几个!
  12. 小米路由3刷华硕潘多拉固件教程及软件相关
  13. xprinter打印机android 开发文档,芯烨智能打印机,让手机功能更神奇
  14. Linux下Oracle11G64位安装流程
  15. 小案例 JavaScript-简易五子棋
  16. 基于ES7243E ADC芯片I2S接口在BES平台上LINE-IN驱动开发
  17. h5手机端或PC端利用高德地图获取当前定位位置
  18. uniapp返回上一级选择性刷新数据,不重新加载页面
  19. audio标签的播放、暂停、重播、进度拖拽等操作
  20. 编译android平台libyuv库(使用ndk)

热门文章

  1. 元宇宙数字虚拟人app开发
  2. 计算机绘图自考知识点,天津2012年自考“计算机绘图(CAD)”课程考试大纲
  3. 引入第三方jar包编译正常,运行报错的问题解决方法
  4. 2020上海国际创客大赛 EdgeX 专题赛即将启动
  5. 设计模式--单例模式 改进型懒汉式
  6. 视频号带货如何设置?视频挂链接,直播如何加商品?
  7. 空间几何 开源_开源为所有人提供了空间
  8. 计算机考证登录密码忘了怎么办
  9. mysql 编译 性能_Icc编译MySQL性能调研
  10. vue 报警告:Failed to resolve component:ConsTtem IFthis is a native custom element,make sure to exclude