在上一篇《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出了什么问题,后来在网上找到一些文章,才了解到这个信息是个啥意思,下边将简单介绍一下这个日志信息的含义:

  1. GC
    表明进行了一次垃圾回收,前面没有Full修饰,表明这是一次Minor GC ,注意它不表示只GC新生代,并且现有的不管是新生代还是老年代都会STW。
  2. Allocation Failure
    说明本次引起GC的原因是 年轻代中没有足够的空间能够存储新的数据了。
  3. ParNew
    表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器(CMS 默认垃圾收集器)。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX:ParallelGCThreads参数限制)。该收集器采用复制算法回收内存,期间会停止其他工作线程,即Stop The World。
  4. 221714K->11707K(235968K)
    • 221714K:GC前该内存区域(这里是年轻代)使用容量
    • 11707K:GC后该内存区域使用容量
    • 235968K:该内存区域总容量。
  5. 0.0503991 secs
    该内存区域GC耗时,单位是秒
  6. 246868K->36861K(1022400K)
    • 246868K:堆区垃圾回收前的大小
    • 36861K:堆区垃圾回收后的大小
    • 1022400K:堆区总大小
  7. 0.0504764 secs
    该内存区域GC耗时(单位是秒)
  8. [Times: user=0.05 sys=0.00, real=0.05 secs]
    • user=0.05:用户态耗时(单位是秒)
    • sys=0.00:内核态耗时(单位是秒)
    • real=0.05:总耗时(单位是秒)
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐