CMS 触发GC(Allocation Failure)解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 针对GC中发生的"Allocation Failure"

       针对GC中发生的"Allocation Failure",源码描述为:Allocation Failure is a cause of GC cycle to kick in.        "Allocation Failure" means that no more space left in Eden to allocate object. So, it is normal cause of young GC.        Older JVM were not printing GC cause for minor GC cycles.        "Allocation Failure" is almost only possible cause for minor GC. Another reason for minor GC to kick could be CMS remark phase (if +XX:+ScavengeBeforeRemark is enabled).

       分代收集器:

       ParNew:一款多线程的收集器,采用复制算法,主要工作在 Young 区,可以通过使用

-XX:ParallelGCThreads 参数来控制收集的线程数,整个过程都是STW的,常与CMS组合使用。

       CMS:以获取最短回收停顿时间为目标,采用“标记-清除”算法,分 4 大步进行垃圾收集,其中初始标记和重新标记会 STW ,多数应用于互联网站或者 B/S 系统的服务器端上,JDK9 被标记弃用,JDK14 被删除,详情可见 JEP 363

  •  业务场景


393537.923: [GC (Allocation Failure) 393537.923: [ParNew: 277920K->5804K(306688K), 0.0254145 secs] 1619294K->1347211K(2063104K), 0.0257722 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
394659.416: [GC (Allocation Failure) 394659.416: [ParNew: 278444K->5412K(306688K), 0.0189196 secs] 1619851K->1346850K(2063104K), 0.0192075 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
395824.591: [GC (Allocation Failure) 395824.591: [ParNew: 278052K->5905K(306688K), 0.0227978 secs] 1619490K->1347361K(2063104K), 0.0231599 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
396658.661: [GC (Allocation Failure) 396658.661: [ParNew: 278545K->4291K(306688K), 0.0194256 secs] 1620001K->1345779K(2063104K), 0.0197811 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
397674.141: [GC (Allocation Failure) 397674.141: [ParNew: 276931K->5287K(306688K), 0.0213385 secs] 1618419K->1346807K(2063104K), 0.0216235 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]

  •    日志解析
  • GC前面没有Full修饰,表明此应用服务进行了一次Minor GC 。注意它不表示只GC新生代,并且现有的不管是新生代还是老年代都会STW        
  • Allocation Failure: 表明引起本次应用GC的原因是因为在年轻代中没有足够的空间能够存储新的数据。        
  • ParNew: 表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX:ParallelGCThreads参数限制)。该收集器采用复制算法回收内存,期间会停止其他工作线程,即Stop The World        
  • 277920K->5804K(306688K)单位为KB。三个参数分别为:GC前该内存区域(这里是年轻代)使用容量,GC后该内存区域使用容量,该内存区域总容量。        
  • 0.0254145 secs:表明内存区域GC耗时,单位是秒。        
  • 1619294K->1347211K(2063104K):三个参数分别为:堆区垃圾回收前的大小,堆区垃圾回收后的大小,堆区总大小。        
  • 0.0257722 secs:该内存区域GC耗时,单位是秒。        
  • [Times: user=0.05 sys=0.00, real=0.02 secs]:分别表示用户态耗时,内核态耗时以及总耗时
  • 根据gc log文件分析可以得出结论:        
  • (1)该次GC新生代减少了277920K - 5804K = 272116K        
  • (2)该次GC Heap区总共减少了1619294K - 1347211K = 272083K        272116 – 272083 = 33K,说明该次共有33K内存从年轻代移到了老年代,可以得出数量并不多,说明都是生命周期短的对象,只是这种对象较多
  •  
  •    解决方案

     (1)   尽量避免Full GC的发生,让对象尽可能的在年轻代就回收掉,此处,可适当增加年轻代-Xmn的大小,让那33K的数据也保存在年轻代中。        

     (2)   优化分析代码,将可疑对象揪出来。



相关文章
|
4月前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用
|
缓存 算法 Java
JVM CMS GC算法解析
JVM CMS GC算法解析
86 0
|
算法 Java UED
深入解析CMS垃圾回收器
在CMS之前的垃圾回收器,要么就是串行垃圾回收方式,要么就是关注系统吞吐量,而 CMS 垃圾回收器的出现,则打破了这个尴尬的局面。
346 0
深入解析CMS垃圾回收器
|
前端开发 Java
Java虚拟机 CMS GC 调优解析
随着 JDK 版本的不断升级,其 GC 策略也随之不停革新,从早期的 1.4 到如今的 11(本文仅讨论在线上环境落地规模较大的版本),其对应的 GC 策略也随之由 Serial、Parallel、CMS 演进至当前的 G1 甚至即将落地的 ZGC 。每一次的调整无不是基于环境的适配性以及业务场景特性,无论如何,只要能够基于特定的操作系统内核、物理内存、JDK版本以及业务特性,达到收益最大化,采用何种实现策略都不为过。当然,还是建议大家以官方的推荐为准,基于自己的业务场景进行不断优化调整,这样才能保证万无一失,使得我们的业务能够健康发展。
179 0
|
存储 监控 算法
Java虚拟机 G1 GC 调优解析
在上篇文章中,我们解析了 Java 虚拟机体系生态中基于 CMS GC 策略的调优场景及基本案例,具体链接为:Java虚拟机 CMS GC 调优解析。本文则重点介绍另一款当前比较流行的 GC 策略 - G1。
420 0
|
监控 Java Unix
Java GC Log Time解析
通常,我们在了解应用服务的性能时,都会去在所定义的垃圾收集日志文件中去分析GC活动轨迹,在gc.log文件中,我们经常会看到每个GC事件所打印的三种时间类型: “ User ”、“ Sys ”及“ Real ”,它们分别表示什么呢?具有哪些象征性意义呢?本文将结合作者的相关实际经验进行简要解析,希望阅读完本篇文章后对大家在GC Log这块的问题定位与分析有所帮助。
210 0
|
机器学习/深度学习 人工智能 监控
GC日志分析工具-GCeasy解析
一款新的GC日志分析仪器,业界首个基于人工智能机器学习指导的垃圾收集日志分析工具。 GCeasy具有内置的智能功能,可以自动检测JVM和Android GC日志中的问题并为之推荐解决方案。
804 0
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
78 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
64 0

推荐镜像

更多