java虚拟机年轻代的gc
垃圾分贷收集
当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象的存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,对象都是每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。
复制算法
由于年轻代的对象大多数都是朝生夕死,所以适合复制算法。它可以将可用内存分为2块区域,每次只使用其中的一块,当这一块使用完之后,就将还存活的对象复制到另一块中,然后再将已使用过的内存一次清理调。这样使得每次都只针对其中的一块内存进行回收,内存分配也不用考虑内存碎片化的情况了。复制算法如下图:
年轻代中的gc过程
HotSpot JVM把年轻代分为了两部分:Eden区和Survivor区,默认比例为8:2。Survivor区又可以分为From Survivor和To Survivor区,其中From Survivor和To Survivor在GC的过程中是可以相互转化的。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。
由于新对象在Eden空间分配内存,如果Eden剩余内存小于20%,就会触发Minor GC。在GC开始的时候,对象只会存在于Eden区和From Survivor区,To Survivor”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认是15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,需要老年代进行分配担保,会将所有对象移动到年老代中。老年代要对这些对象担保,前提是老年代本身还有剩余的容量。不过每次会有多少对象进入老年代,在实际完成内存回收钱是无法预知的,所以只好取之前每一次回收晋升到老年代对象容量的平均值作为经验值,与老年代剩余空间比较,判断是否需要进行Full GC来让老年代腾出更多的空间。下面是年轻代回收过程图:
年轻代常见JVM参数
1.-Xmn
年轻代大小(1.4or lator),注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小。增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。用法-Xmn256m。-Xmn 与 -XX:NewSize的值等价。
2.-XX:NewRatio
-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
3.-XX:SurvivorRatio
设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
4.-XX:MaxTenuringThreshold
如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率该参数只有在串行GC时才有效.
5.-XX:MaxNewSize
年轻代最大值,用法XX:MaxNewSize=256m
6.-XX:NewSize
设置年轻代大小-XX:NewSize=256m
java虚拟机年轻代的gc相关推荐
- Java虚拟机(三)--------GC算法和收集器
如何判断对象可以被回收 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的 对象) 引用计数法 给对象添加一个引用计数器,每当有一个地方引用,计数器 ...
- java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...
[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...
- 《深入理解java虚拟机》笔记2——GC算法与内存分配策略
说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...
- 大战Java虚拟机【2】—— GC策略
前言 前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象.那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定 ...
- Java --- JVM年轻代与老年代
一.年轻代与老年代 1.存储在VM中的Java对象可以被划分为两类:①.一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速.②.另外一类对象的生命周期却非常长,在某些极端的情况下还能够与VM ...
- 深入理解java虚拟机gc_java底层:GC相关——深入理解java虚拟机
Java垃圾回收之回收算法 光有垃圾标记算法还不行,JVM还需要有垃圾回收算法来将这些标记为垃圾的对象给释放回收掉.主要的回收算法有以下几种: 1.标记 - 清除算法(Mark and Sweep): ...
- 豆瓣评分8.0:深入理解Java虚拟机,把的GC算法与实现讲得明明白白
Java垃圾回收 有学过JVM垃圾回收机制的小伙伴肯定了解过GC调优,当面试官问到这个问题时,相信很多小伙伴第一时间想到的就是调节几个参数,调节一下分代的大小.可是这么简单的几句话怎么能让面试官觉得你 ...
- java虚拟机6.HotSpot的GC实现
待续 转载于:https://www.cnblogs.com/shanhm1991/p/9916093.html
- Java 年轻代、年老代、GC
一篇关于gc的文章 http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html 自己的笔记: JVM是用c语言写的.一般说的JVM是 ...
最新文章
- 将窗体中名称为iremark_习题三新
- opensuse11.4-fcitx输入法安装
- 四轴飞行器实践教程(内部资料)
- Adobe Premiere Elements 2021中文版
- 中台,都他妈被你们说糊涂了,文内才是正宗解释,别摸石头过河了,石头早就有了
- 21天java基础入门总结
- 控制算法简析3——LKA中PID控制的error选取
- mysql导入大量数据时jbd2 io过高效率低下问题
- 小程序数据监测工具分析
- rn 地图根据区名获取经纬度_React Native获取地理位置(获取具体城市、经纬度)...
- C语言停车场管理模拟系统
- Kanzi Shader入门
- JS手机号身份证验证
- 非链特异性转录组测序
- 网站页面上标签页小图标的添加方式
- 中国科技技术大学潘建伟计算机,中国研制量子计算机“九章” 比超级计算机快一百万亿倍...
- Mermaid classDiagram类图应用举例 汉,蜀汉,刘宋关系图
- 视频播放器播放flv报错Flv: Unsupported audio codec idx: 7
- hana 查看表字段_SAP HANA 表格
- Fragment+RadioButton实现点击切换页面效果