新生代gc耗时分析

Banq注:JVM分为新生代和老一代 , 老一代是在新生代中新创建的,通过了垃圾回收 。如果不能回收,会逐渐转移到老一代,老一代内存可以缓存Inmemeory数据 , 显然,新老两代的垃圾收集算法有所不同 。
1、一篇文章搞懂G1收集器GarbageFirst(简称G1)收集器是垃圾收集器技术发展史上的一个里程碑式的成就,首创了本地收集的收集器设计思想和基于区域的内存布局形式 。作为CMS收集器的替代者和继承者 , 设计者希望做出一个可以建立“暂停时间模型”的收集器,这意味着它可以支持指定在m毫秒的时间段内,垃圾收集花费的时间不超过n秒的目标 。
在G1收集器出现之前 , 所有其他的收集器 , 包括被G1收集器取代的CMS,其垃圾收集目标范围都是整个新生代(MinorGC)或者整个MajorGC,或者整个Java堆(FullGC) 。G1意识到它可以用于堆内存的任何部分来形成一个集合 。衡量的不再是代,而是收回的实际收益,这就是MixedGC模型 。基于区域的G1堆内存布局是实现MixedGC的关键 。
2、减少长时间的GC停顿如果你的应用的对象创建率很高,垃圾收集率也会很高 。高垃圾收集率也会增加GC暂停时间 。因此,优化应用程序以创建更少的对象是减少长时间GC暂停的有效策略 。这可能是耗时的比较,但100%值得 。为了优化应用程序中对象创建的速度,可以考虑使用JavaProfiler(如JProfiler、YourKit、JVM...).
年轻一代太年轻,对象就会过早提拔到老一代 。从老年人那里收垃圾比从年轻一代那里收垃圾要花更多的时间 。因此,增加年轻一代的规模可以减少长时间的GC暂停 。您可以通过设置这两个JVM参数中的任何一个来增加年轻一代GC算法的选择,这对GC暂停时间有很大的影响 。除非您是GC专家或者打算成为专家,或者您团队中的某个人是GC专家,否则您可以调整GC设置以获得最佳的GC暂停时间 。
3、如何解决java gc导致的延迟内存(条带)便宜 。不幸的是,垃圾收集机制导致的挂起会严重影响系统性能 。好像JVM内存最多支持2G,作者花了很多时间精力用32G来提升系统性能 。这篇文章是他的经历 。GC调优是非常应用相关的,本文的目标是使用10G更大的堆和严格的响应时间(毫秒级)(吞吐量和延迟是一对矛盾,这个GC调优主要追求低延迟) 。作者项目的特点如下:1 .堆用于在内存中存储数据结构;2.堆大小超过10G3.要求请求时间更快;4.事务很短(几百毫秒);5.内存中数据修改频率和面积较低,所以整个10g内存一秒钟不会被修改 , 每秒钟可以更新10M 。
4、JVMYoungGen( 新生代Sun的JVM把整个堆分为三代:YoungGen( 新生代),OldGen(老一代),PermGen(持久区):MinorGC:通常指新生代的回收 。MajorGC:通常指老一代的回收 。Full GC:主GC需要扫描并回收整个堆,除了concurrent gc 。复制复制算法:要复制大量数据,不会出现碎片 。标记算法:从引用根节点标记所有被引用的对象,清除未被引用的对象 。
杨又进一步分为伊甸、幸存者1(来自太空)和幸存者2(前往萨佩斯) 。年轻一代区域中对象的生命周期相对较短,gc回收这些对象时采用复制算法 。每当创建一个对象时,Eden都会分配这个区域 。当伊甸园无法分配时,Minor gc触发一次 。
5、GC日志的 分析以下是GC日志 。0.244:在系统启动后0.244秒出现 。GC(allocation failure):GC):GC发生的原因,对象分配失败 。0.245:当系统运行0.245秒时出现 。[PAR NEW: 3170K > 512K (4608K),0 。SECS]: PAR NEW已回收垃圾,新生代总可用空间大小4608KEden区 1幸存者区 , 回收前占用3170K , 回收后,新生代 。
【新生代gc耗时分析】3170K>1652K(9728K) , 0.secs是对整个堆空间内存回收的描述 。整个堆空间(新生代old times)是9728K , 恢复前用了3170K,恢复后还用了1652K,这个GC总共用了0.secs秒 。第一行:parNew管理总内存4608K,已使用3704K , 第二行:伊甸园区,总面积4096K,已经使用了77%的空间 。

    推荐阅读