GC (Allocation Failure) 日志分析
最近在做 SpringBoot 项目(我的项目最终是要被打成 docker image 的)调优的过程中,由于启动 Jar 的时候设置了XX:+PrintGCDetails 参数,所以在容器启动的过程中初夏了如下日志信息:[GC (Allocation Failure) [ParNew: 221714K->11707K(235968K), 0.0503991 secs] 246868K-..
·
在上一篇《SpringBoot 项目调优》文章中我介绍了下我是如何对 SpringBoot 项目进行调优的,由于我的项目最终会被打成 docker image,所以对于JVM的调优,是在 Dockerfile 中进行的,如下图:
这里需要注意一下 XX:+PrintGCDetails 参数,由于配置了该参数,所有项目在容器启动的过程中会打印出了如下日志信息:
[GC (Allocation Failure) [ParNew: 221714K->11707K(235968K), 0.0503991 secs] 246868K->36861K(1022400K), 0.0504764 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
起初误以为是不是GC出了什么问题,后来在网上找到一些文章,才了解到这个信息是个啥意思,下边将简单介绍一下这个日志信息的含义:
- GC
表明进行了一次垃圾回收,前面没有Full修饰,表明这是一次Minor GC ,注意它不表示只GC新生代,并且现有的不管是新生代还是老年代都会STW。 - Allocation Failure
说明本次引起GC的原因是 年轻代中没有足够的空间能够存储新的数据了。 - ParNew
表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器(CMS 默认垃圾收集器)。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX:ParallelGCThreads参数限制)。该收集器采用复制算法回收内存,期间会停止其他工作线程,即Stop The World。 - 221714K->11707K(235968K)
- 221714K:GC前该内存区域(这里是年轻代)使用容量
- 11707K:GC后该内存区域使用容量
- 235968K:该内存区域总容量。
- 0.0503991 secs
该内存区域GC耗时,单位是秒 - 246868K->36861K(1022400K)
- 246868K:堆区垃圾回收前的大小
- 36861K:堆区垃圾回收后的大小
- 1022400K:堆区总大小
- 0.0504764 secs
该内存区域GC耗时(单位是秒) - [Times: user=0.05 sys=0.00, real=0.05 secs]
- user=0.05:用户态耗时(单位是秒)
- sys=0.00:内核态耗时(单位是秒)
- real=0.05:总耗时(单位是秒)
更多推荐
已为社区贡献5条内容
所有评论(0)