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

一、JVM堆分代

1、JVM堆被分为了年轻代和老年代。年轻代的GC过程称为Yong GC,速度快较频繁。老年代的GC过程称为Full GC,速度较慢应该尽量避免。

2、对象被创建后,除了少部分大对象会在老年代分配内存外,大部分的对象首先都是在年轻代进行内存分配,而且大部分的对象都是“朝生夕死”,很快就会被年轻代的Yong GC回收掉。

3、老年代的内存空间一般会比年轻代的内存空间大,能存放的对象多,老年代的空间不足后会进行Full GC操作,比Yong GC耗时,所以应尽量避免频繁的Full GC操作。

二、年轻代的分区

1、年轻代中分为一个Eden区和两个Surviver区,比例为8:1:1,两个Surviver区分别称为“From”区和“To”区。对象在Eden区创建,经过一次Yong GC后,还存活的对象将会被复制到Surviver区的“From”区,此时“To”区是空的。到了下一次GC的时候,Eden区还存活的对象会复制到Surviver区的“To”区,而“Form”区的对象有两个去处,“From”区的对象会根据经过的GC次数计算年龄,如果年龄到达了阈值(默认15),则会被移动到老年代中,否则就复制到“To”区,此时“From”区变成了空的,然后“From”区和“To”区进行角色互换,到下一次进行GC时,还是有一块空的“To”区,用来存放从eden区和“From”区移动过来的对象。

2、那这种分区有什么好处呢?

a、在年轻代新增Surviver区,有利于减轻老年代的负担,尽可能的让大部分对象在年轻代通过较高效的Yong GC回收掉,不至于老年代里存放的对象过多导致内存不足而进行频繁的Full GC操作。

b、这种分区有利于减少内存碎片的产生。

首先我们来看看,如果年轻代只分为Eden区和Surviver区两个区域并且比例是8:2的时候,内存的回收和分配情况会怎么样。第一次Yong GC后,Eden区还存活的对象移动到Surviver区,Surviver区还存活的对象保留在Surviver区,而这些对象的内存是不连续的,Surviver区里就会产生很多内存碎片,这就会导致有些大对象要移动到Surviver区的时候,没有足够的连续内存进行分配,而不得不移动到老年代中,增加老年代的负担,降低效率。

然后我们看看Eden区和Surviver区的比例是8:1:1时会有什么样的效果。第一次Yong GC后,Eden区还存活的对象复制到Surviver区的“To”区,“From”区还存活的对象也复制到“To”区,再清空Eden区和From区,这样就等于“From”区完全是空的了,而“To”区也不会有内存碎片产生,等到第二次Yong GC时,“From”区和“To”区角色互换,很好的解决了内存碎片的问题。

如下图所示:

有人要说为什么一定是8:1:1的比例呢,这大概是前辈们实践出来的最佳比例吧~~

新生代Eden区、两个Survivor区及老年代的关系相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  10. jvm深入理解:内存分配与回收策略(优先在Eden分配、大对象直接进入老年代、长期存活的对象将进入老年代、动态对象年龄判定、空间分配担保)

    出入:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存. 象的内存分配,从 ...

最新文章

  1. Android -- EventBus使用
  2. 网速测量、流量监控软件 Bandwidth Meter Pro
  3. 表单验证以及下拉框应用
  4. Java 的插件框架 PF4J
  5. 存到mysql的中文乱码_将用户输入的中文保存到数据库出现中文乱码问题
  6. 基于混合云存储系统的电影推荐引擎小结
  7. 【华为云实战开发】2.Docker镜像部署怎么玩才酷炫?
  8. 迷你计算机笔记本,迷你笔记本电脑我选择了它,性能不错还超轻便携
  9. maven工程找不到jar包(依赖)的解决方法
  10. mysql5.6.19安装图解_mysql5.6.19安装说明
  11. pythonweb静态服务器_python实现外部静态服务器,浏览器通过HTTP与之通信2
  12. 邮箱登陆html,用html写的简单的邮箱登陆界面
  13. 【转】所需即所获:像 IDE 一样使用 vim
  14. firedrake求解NS方程
  15. Excel技巧之插入图表
  16. es6字符串添加html标签,JavaScript_详解JavaScript ES6中的模板字符串,在 ES6 中引入了一种新的字符 - phpStudy...
  17. 用爬虫分析上热榜涨的600粉,竟发现。。。(含代码和详解)
  18. python学习 day49之CSS网页布局
  19. java:AXIS调用webService接口,返回String类型xml,并用dom4j简单解析xml
  20. 基于小波分析与深度学习的脑电信号分类(matlab)

热门文章

  1. 由于文件损坏或丢失造成windows无法启动
  2. Vue教程-day03-2018年12月21日笔记
  3. 抖音java表白教程_抖音表白代码制作方法 需要技巧
  4. html绘制曲线路径,使用钢笔工具绘制曲线路径.ppt
  5. MFC 之 控件位置、大小的获取、控件的移动
  6. 推动新能源越野场景革命 坦克品牌开创越野新生态
  7. curl批量调用linux,shell的简单批量curl接口脚本
  8. Android屏幕刷新机制
  9. 宝塔反向代理设置的一些坑
  10. 什么邮件会被标记为垃圾邮件_停止将电子邮件标记为垃圾邮件的6种方法