当前位置: 首页 > news >正文

jvm中的新生代Eden和survivor区

聊聊JVM的年轻代

1.为什么会有年轻代

我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

 

2.年轻代中的GC

    HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

young_gc

 

3.一个对象的这一辈子

我是一个普通的java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

4.有关年轻代的JVM参数

1)-XX:NewSize和-XX:MaxNewSize

用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。

2)-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,这个值也比较重要。

3)-XX:+PrintTenuringDistribution

这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。

4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold

用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。

 

文章出处:http://ifeve.com/jvm-yong-generation/

 

转载于:https://www.cnblogs.com/chengjunhao/p/8296378.html

相关文章:

  • 2017年期末获奖名单
  • Copy修饰的NSArray
  • hive:导出数据记录中null被替换为\n的解决方案
  • Python python-nmap多线程端口扫描脚本(转载)
  • 通过curl得到http各阶段的响应时间
  • 深入浅出理解分类(Category)和类扩展(Extension)
  • 高阶函数
  • Javascript调试命令——你只会Console.log() ?
  • oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理...
  • windows安装 pip
  • 一起学JAVA之《spring boot》03 - 开始spring boot基本配置及项目结构(转)
  • centos5中添加163yum源
  • js便签笔记(7)——style、currentStyle、getComputedStyle区别介绍【转载】
  • 都说要用人工智能改变医疗行业,不过……医生怎么看?
  • SpingCloudBus整合RabbitMQ
  • 2017年终总结、随想
  • Android 控件背景颜色处理
  • ERLANG 网工修炼笔记 ---- UDP
  • IDEA 插件开发入门教程
  • Java多态
  • java中的hashCode
  • MobX
  • react-native 安卓真机环境搭建
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vim Clutch | 面向脚踏板编程……
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 大整数乘法-表格法
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 给初学者:JavaScript 中数组操作注意点
  • 离散点最小(凸)包围边界查找
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 我的业余项目总结
  • 我是如何设计 Upload 上传组件的
  • 赢得Docker挑战最佳实践
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 智能合约Solidity教程-事件和日志(一)
  • Semaphore
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #define 用法
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (33)STM32——485实验笔记
  • (floyd+补集) poj 3275
  • (二)学习JVM —— 垃圾回收机制
  • (十) 初识 Docker file
  • (十三)Flask之特殊装饰器详解
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)Linux+Windows下安装ffmpeg
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Net FrameWork总结
  • .NET Micro Framework 4.2 beta 源码探析