垃圾分贷收集

当前商业虚拟机的垃圾收集都采用“分代收集”(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相关推荐

  1. Java虚拟机(三)--------GC算法和收集器

    如何判断对象可以被回收 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的 对象) 引用计数法 给对象添加一个引用计数器,每当有一个地方引用,计数器 ...

  2. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  3. 《深入理解java虚拟机》笔记2——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  4. 大战Java虚拟机【2】—— GC策略

    前言 前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象.那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定 ...

  5. Java --- JVM年轻代与老年代

    一.年轻代与老年代 1.存储在VM中的Java对象可以被划分为两类:①.一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速.②.另外一类对象的生命周期却非常长,在某些极端的情况下还能够与VM ...

  6. 深入理解java虚拟机gc_java底层:GC相关——深入理解java虚拟机

    Java垃圾回收之回收算法 光有垃圾标记算法还不行,JVM还需要有垃圾回收算法来将这些标记为垃圾的对象给释放回收掉.主要的回收算法有以下几种: 1.标记 - 清除算法(Mark and Sweep): ...

  7. 豆瓣评分8.0:深入理解Java虚拟机,把的GC算法与实现讲得明明白白

    Java垃圾回收 有学过JVM垃圾回收机制的小伙伴肯定了解过GC调优,当面试官问到这个问题时,相信很多小伙伴第一时间想到的就是调节几个参数,调节一下分代的大小.可是这么简单的几句话怎么能让面试官觉得你 ...

  8. java虚拟机6.HotSpot的GC实现

    待续 转载于:https://www.cnblogs.com/shanhm1991/p/9916093.html

  9. Java 年轻代、年老代、GC

    一篇关于gc的文章 http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html 自己的笔记: JVM是用c语言写的.一般说的JVM是 ...

最新文章

  1. Math.Round()——面试题小结
  2. 【转】MVVM大比拼小结
  3. GIT学习笔记2--基本使用
  4. linux vi 复制一个单词_vi或vim的快速操作技巧你知道吗?
  5. 输出质数(java)
  6. 微软更新补丁手动下载地址
  7. 2019 deecamp B题不完全的记录
  8. 夜神模拟器Nox.exe支持命令行参数列表
  9. 反入侵体系建设入门-攻击场景梳理
  10. 7、公共电话交换网络(物理层)
  11. C++中使用辅助函数寻找最大/最小值:min()、max()、minmax()
  12. 帝国时代3如何快速实现增加建筑/农民数量上限
  13. 关于 Kubernetes中Service的一些笔记
  14. 结束语-放弃完美主义,执行力就是限时限量认真完成
  15. 极点突然中文标点变全角了
  16. 测试杂谈之一初生牛犊
  17. P1071,OpenJudge1.7-11潜伏者详解
  18. java里面自行车的属性_Java模拟自行车电动车属性调用
  19. 情感驿站 | 人生若是修行路,红尘处处皆道场
  20. iperf java_网络性能测试工具Iperf/Jperf

热门文章

  1. Ubuntu远程SSH连接与远程桌面连接
  2. 怎么储存才能让CPU永久性使用导热硅脂
  3. 向日葵android比pc端慢很多,向日葵远程控制Android主控端9.5上线,交互流畅性全面升级...
  4. DB2快速入门—DB2 11的安装与使用
  5. 最新版db2 express c 10.1安装图解
  6. 我是如何实现「朋友圈图片评论」的?
  7. 重庆高中计算机会考有没有打字,重庆书记员技能测试要求!
  8. C语言学习《经典C语言程序100例》day 2
  9. 【工业大数据】张洁教授现场剖析制造业大数据制造的思考与实践
  10. 将数组中数字0元素移动到数组末尾