`
collegeyuan
  • 浏览: 29684 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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”区被填满之后,会将所有对象移动到年老代中。

<iframe id="iframe_0.08459896309287074" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width: 829px; height: 345px;" src="data:text/html;charset=utf8,%3Cstyle%3Ebody%7Bmargin:0;padding:0%7D%3C/style%3E%3Cimg%20id=%22img%22%20src=%22http://ifeve.com/wp-content/uploads/2014/07/young_gc.png?_=5556188%22%20style=%22border:none;max-width:867px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.08459896309287074',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no"></iframe>

 

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。

分享到:
评论

相关推荐

    Java新生代老年代的划分及回收算法

    根据堆中对象的存活周期将堆内存分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活。而老年代中存放的对象存活率高。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括...

    JVM内存模型架构图-新生代-老年代-永久代

    JVM内存模型架构图,核心部分包括: GC主要在新生区(伊甸园区)、老年区 新生区(伊甸园区(对象都是在这个区new出来的)、幸存区to、幸存区from:幸存区位置会互相交换,谁空谁是to) 老年区 永久区:存储的是...

    JVM调优与内存管理总结

    JVM内存调优,java内存管理总结。包含新生代、老年代等详解。还有垃圾回收收集器详解。

    三七互娱面经

    三七互娱一面面经 投的java开发,和百度到的面经不一样的,都没有照着简历问,更加偏向工程 1、问项目,涉及到了一个sql优化,你是...10、jvm新生代老年代 11、tcp怎么保证可靠传输(慢启动,拥塞避免,快重传,快恢复

    JVM面试要点

    JVM面试要点,讲解JVM的常问问题,类加载机制,栈,堆,新生代,老年代的讲解等等。

    JVM调优相关内容教程吐血整理干货.md

    设置老年代与新生代的空间占比。 如: -XX:NewRatio=2,那么老年代:新生代=2:1。 -XX:SurvivorRatio=? 设置eden与survivor的空间占比。 如: -XX:SurvivorRatio=2,那么eden:from survivor:to survivor=2:1:1 -XX:...

    阿里面试题 JVM-开源框架.docx

    JVM知识 什么情况下会发生栈内存溢出。...JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。 JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。

    JVM常见面试题解析1

    1.什么情况下会发生栈内存溢出 2.详解JVM内存模型 3.JVM内存为什么要分成新生代,老年代,持久代 4. JVM中一次完整的GC流程是怎样的,对象如何晋升

    JVM原理与调优实战下载即用

    设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3。 默认的就是1:2 减少GC对老年代的回收。设置生代带垃圾对象最大年龄,进量不要有大量连续内存空间的java对象,因为会直接到老年代,内存不够就会执行GC 开发...

    2024年java面试题-jvm性能调优面试题第一部分

    核心内容就在于介绍jvm方面的调优方案以及策略吧,包括 jvm 的内存模型,新生代、老年代、持久代、oom、对应的参数设置以及为啥要这样设置等等,这份资料都有所介绍,当然啦,一份是介绍不完的,感性的大伙儿可以看...

    37-JVM优化1

    3.2、大对象不可避免的情况下,让其直接进入老年代:-XX:PetenureSizeThreshold 3.3、在不影响老年代空间的情况下,尽量把对象留在新生代

    zabbix监控tomcat(包含jvm监控)

    我们的监控系统是zabbix,最近刚做完jvm还有tomcat的监控,需要吐槽以下内容:zabbix官方提供的jvm和...堆内存内存池:新生代(edenspace),survivorspace,老年代(oldgen)的内存使用状态;非堆内存内存池:代码缓存

    java8rt.jar源码-JVM:学习JVM

    java8 rt.jar源码 JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。...内存回收:现在基本都采用分代收集算法,细分为新生代,老年代; 堆内存:需完成实例

    一文了解JVM全部垃圾回收器,从Serial到ZGC

    CMS、SerialOld、ParalledOld用于老年代。并且他们相互之间以相对固定的组合使用(具体组合关系如上图)。G1是一个独立的收集器不依赖其他6种收集器。ZGC是目前JDK11的实验收集器。下面来看看各个收集器的特性Serial...

    Java最常见200面试题以及解析

    老年代回收器:Serial Old、Parallel Old、CMS 整堆回收器:G1 新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点 是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。

    超硬核!!!一篇文章搞定整个JVM的垃圾回收系统

    JVM的垃圾回收机制JVM的垃圾回收机制1 什么是垃圾回收机制2 finalize方法作用3 新生代、老年代、永久代(方法区)的区别3.1 为什么要这样分代:3.2 Minor GC、Major GC、Full GC区别及触发条件4 如何判断对象是否存活...

    JAVA面试核心知识点283页

    1.目录 1 2.JVM 19 2.1. 线程 20 2.2.JVM 内存区域 21 ...2.3.2.老年代 25 2.3.3.永久代 25 2.3.3.1.JAVA8 与元数据 25 2.4.垃圾回收与算法 26 2.4.1.如何确定垃圾 26 2.4.1.1.引用计数法 26 2.4.1.2

    java面试题.docx

    -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4; -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2; –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合; -XX:+...

    21天学会Java之(Java SE第四篇):Java虚拟机、垃圾回收机制

    文章目录Java虚拟机(JVM)JVM的基本结构类加载机制类的生命周期类加载器的种类类加载机制运行时数据区(内存分析)垃圾回收机制新生代(Young Generation)老年代(Old Generation)元空间(Meta Space) Java虚拟机...

Global site tag (gtag.js) - Google Analytics