新生代垃圾回收

之前的两篇文章(java运行时数据区浅析、java垃圾收集器(GC)浅析)介绍了java运行时数据区以及GC垃圾回收算法的相关知识,大家可以先去看看这两篇文章。

本篇文章将重点关注新生代的垃圾回收。

大部分JVM都会采用所谓的分代收集方式去回收垃圾,什么是分代收集呢?

根据对象的存活周期的不同将内存划分为好几块。一般是把java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适合的收集算法。新生代中,每次垃圾收集时都发现大批对象死去,只有少量存活,那就选用复制算法。老年代因为对象存活率高,没有额外空间对它进行分配担保,那就必须使用“标记-清理”或者“标记-整理”等重量级算法来进行回收。

单纯从JVM的功能考虑,并不需要新生代,完全可以针对整个堆进行操作。新生代存在的唯一理由是优化垃圾回收的性能。更具体的说,把堆划分为新生代和老年代有两个好处:

1.简化了新对象的分配(只在新生代分配内存);

2.可以更有效的清除不再需要的对象(即死对象,新生代和老年代使用不同的回收算法)。

通过广泛研究面向对象实现的应用,发现一些特点:

1.大部分对象的生存时间都很短;

2.新生对象很少引用生存时间长的对象。

所以,新生代通过复制算法可以高效的回收垃圾。

根据上面的思想,我们继续将堆区域划分成如下部分:

首先堆可以划分为新生代和老年代,然后新生代又可以划分为一个Elden区和两个Survivor(幸存)区。

按照规定,新对象会首先分配在Eden中(如果对象过大,比如大数组,将会直接放到老年代)。在GC中,Eden中的对象会被移动到survivor中,直至对象满足一定的年纪(定义为熬过minor GC的次数),会被移动到老年代。

新生代采取复制算法,在Minor GC之前,to survivor区域保持清空,对象保存在Eden和from survivor区,minor GC运行时,Eden中的幸存对象会被复制到to Survivor(同时对象年龄会增加1)。而from survivor区中的幸存对象会考虑对象年龄,如果年龄没达到阈值,对象依然复制到to survivor中。如果对象达到阈值那么将被移到老年代。复制阶段完成后,Eden和From幸存区中只保存死对象,可以视为清空。如果在复制过程中to幸存区被填满了,剩余的对象将被放到老年代。最后,From
survivor和to survivor会调换一下名字,下次Minor GC时,To survivor变为From Survivor。

过程如下图所示:

总结一下,对象一般出生在Eden区,年轻代GC过程中,对象在2个幸存区之间移动,如果对象活到适当的年龄,会被移到老年代。当对象在老年代中死亡时,就需要更高级别的GC,更重量级的GC算法。

调优的重要性:新生代的大小设置非常重要,如果新生代过小,会导致新生对象很快就晋升到老年代中,在老年代中对象很难被回收。如果新生代过大,会发生过多的复制过程。因而我们需要找到一个合适的大小,不幸的是,要想获得一个合适的大小,只能通过不断的测试调优,这就需要JVM参数了。

新生代垃圾回收

时间: 2024-10-15 12:33:32

新生代垃圾回收的相关文章

JVM实用参数——新生代垃圾回收

JVM实用参数目录 JVM实用参数——新生代垃圾回收 概述 第1部分  新生代垃圾回收介绍 第2部分 参数介绍 参考 第1部分  新生代垃圾回收介绍 本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation).首先我们会讨论为什么调整新生代的参数会对应用的性能如此重要,接着我们将学习新生代相关的JVM参数. 单纯从JVM的功能考虑,并不需要新生代,完全可以针对整个堆进行操作.新生代存在的唯一理由是优化垃圾回收(GC)的性能.更具体说,把堆划分为新生代和老年代有2

JVM实用参数(五)新生代垃圾回收

JVM实用参数(五)新生代垃圾回收 原文链接  作者: PATRICK PESCHLOW :译者:严亮 本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation).首先我们会讨论为什么调整新生代的参数会对应用的性能如此重要,接着我们将学习新生代相关的JVM参数. 单纯从JVM的功能考虑,并不需要新生代,完全可以针对整个堆进行操作.新生代存在的唯一理由是优化垃圾回收(GC)的性能.更具体说,把堆划分为新生代和老年代有2个好处:简化了新对象的分配(只在新生代分配内存

js的新生代垃圾回收

推荐阅读:https://www.cnblogs.com/chengxs/p/10919311.html 在进行老生代的标记清除法回收以前,还会有一个新生代的垃圾回收算法执行. 新生代和老生代 所谓新生代,指的是新产生的对象:老生代就是经历过新生代垃圾回收后还“存活”下来的对象. 新生代的垃圾回收算法 Scavenge GC 算法很简单: 1. 我们维护一个列表,老生代对象每次指向一个新生对象的时候,记录下来:每次删除指向的时候,删除记录.(这样我们就知道新生代对象里面,哪些对象是存活的了) 2

CMS垃圾回收机制

详解CMS垃圾回收机制 原创不易,未经允许,不得转载~~~ 什么是CMS? Concurrent Mark Sweep. 看名字就知道,CMS是一款并发.使用标记-清除算法的gc. CMS是针对老年代进行回收的GC. CMS有什么用? CMS以获取最小停顿时间为目的. 在一些对响应时间有很高要求的应用或网站中,用户程序不能有长时间的停顿,CMS 可以用于此场景. CMS如何执行?  总体来说CMS的执行过程可以分为以下几个阶段: 3.1 初始标记(STW) 3.2 并发标记 3.3 并发预清理

详解CMS垃圾回收机制

原创不易,未经允许,不得转载~~~ 什么是CMS? Concurrent Mark Sweep. 看名字就知道,CMS是一款并发.使用标记-清除算法的gc. CMS是针对老年代进行回收的GC. CMS有什么用? CMS以获取最小停顿时间为目的. 在一些对响应时间有很高要求的应用或网站中,用户程序不能有长时间的停顿,CMS 可以用于此场景. CMS如何执行?  总体来说CMS的执行过程可以分为以下几个阶段: 3.1 初始标记(STW) 3.2 并发标记 3.3 并发预清理 3.4 重标记(STW)

JVM基础(5)-垃圾回收机制

一.对象引用的类型 Java 中的垃圾回收一般是在 Java 堆中进行,因为堆中几乎存放了 Java 中所有的对象实例.谈到 Java 堆中的垃圾回收,自然要谈到引用.在 JDK1.2 之前,Java 中的引用定义很很纯粹:如果 reference 类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.但在 JDK1.2 之后,Java 对引用的概念进行了扩充,将其分为强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak

Java垃圾回收小结

一.如何确定某个对象是“垃圾”? 首先要搞清一个最基本的问题:如果确定某个对象是“垃圾”?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃圾收集器如何确定某个对象是“垃圾”?—即通过什么方法判断一个对象可以被回收了. 在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行.那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收.不失一般性,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为

高吞吐低延迟Java应用的垃圾回收优化

原文链接: linkedin 翻译: ImportNew.com- hejiani译文链接: http://www.importnew.com/11336.html 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经常用到的一个功能是了解动态信息——不断更新的专业活动和内容的列表.动态信息在LinkedIn随处可见,包括公司页面,学校页面以及最重要的主页.基础动态信息数据平台为我们的经济

问题:虚拟机老生代垃圾回收频繁出现

case: runbroker.sh JAVA_OPT 使用的是默认参数,broker运行过程中新生代垃圾回收次数较少,频繁出现老生代垃圾回收 cms gc ,并且老生代内存回收不掉.造成卡顿.消息发送失败.最终导致java heap 被占用完,broker 宕机.求教! 内存分析: broker瘫痪之后使用jmap生成dump文件,使用MAT进行分析,发现HAService实例Retained 大量内存. 服务器模式是3m ,没有使用slave,但是从机刷盘的服务却占用大量内存,且不能被回收.