文章目录
- 1.GC日志格式
- 1.1 GC分类
- 1.2 GC日志结构剖析
- 1.3 GC日志分析工具
- 1.4 人生感悟
1.GC日志格式
1.1 GC分类
针对HotSpot VM的实现,它里面的Gc按照回收区域又分为两大种类型:
一种是部分收集(Partial GC),一种是整堆收集(Full GC)
部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
新生代收集(Minor GC / Young GC):只是新生代(Eden\S0,S1)的垃圾收集
老年代收集(Major GC / Old GC):只是老年代的垃圾收集。
目前,只有CMS GC会有单独收集老年代的行为。
注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。目前,只有G1 GC会有这种行为
整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。
哪些情况会触发Full GC?
老年代空间不足
方法区空间不足
显式调用System.gc()
Minor GC进入老年代的数据的平均大小大于老年代的可用内存
大对象直接进入老年代,而老年代的可用空间不足
1.2 GC日志结构剖析
垃圾收集器
使用Serial收集器在新生代的名字是Default New Generation,因此显示的是" [DefNew’
使用ParNew收集器在新生代的名字会变成"[ParNew",意思是"Parallel New Generation
使用Parallel Scavenge收集器在新生代的名字是"[PSYoungGen",这里的.DK1.7使用的就是PSYoungGen
使用Parallel old Generation收集器在老年代的名字是”[ParoldGen"
使用G1收集器的话,会显示为"garbage-first heap"
Allocation Failure
表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。
GC前后情况
通过图示,我们可以发现Gc日志格式的规律一般都是:GC前内存占用一>GC后内存占用(该区域内存总大小)
[PSYoungGen: 5986K->696K(8704K)]5986K->704K(9216K)
中括号内:GC回收前年轻代堆大小,回收后大小,(年轻代堆总大小)
括号外:GC回收前年轻代和老年代大小,回收后大小,(年轻代和老年代总大小)
GC时间
GC日志中有三个时间:user,sys和real
user -进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所使用的实际CPU时间,其他进程和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示GC 线程执行所使用的 CPU总时间。
sys -进程在内核态消耗的CPU 时间,即在内核执行系统调用或等待系统事件所使用的CPU时间
real - 程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待I/O完成)。对于并行gc,这个数字应该接近(用户时间+系统时间)除以垃圾收集器使用的线程数。
由于多核的原因,一般的GC事件中,real time是小于sys + user time的,因为一般是多个线程并发的去做GC,所以real time是要小于sys+user time的。如果real>sys+user的话,则你的应用可能存在下列问题:IO负载非常重或者是CPU不够用。
1.3 GC日志分析工具
Gceasy:一款超好用的在线分析GC日志的网站
官网地址:
GCeasy是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄漏检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用的(有一些服务是收费的)
GCViewer
上面介绍了一款在线的GC日志分析器,下面介绍一个离线版的GCViewer。
GCViewer是一个免费的、开源的分析小工具,用于可视化查看由SUN/Oracle,IBM,HP和BEAava虚拟机产生的垃圾收集器的日志。
GCViewer用于可视化Java VM选项-verbose:gc和.NET生成的数据-Xloggc:。它还计算与垃圾回收相关的性能指标(吞吐量累积的暂停,最长的暂停等)。当通过更改世代大小或设置初始堆大小来调整特定应用程序的垃圾回收时,此功能非常有用。
1.4 人生感悟
延迟满足
遵守时间的价值
保有好奇心
注:本文是学习 尚硅谷宋红康JVM全套教程(详解java虚拟机)所做笔记。