JVM问题定位分析(一)
最近的测试过程中,我负责的测试模块被其他同事投诉,说我负责的模块经常挂掉。于是我就开始寻找问题的旅程。
1、首先 我开始查找我负责的模块的日志并没有明显异常。那么我的服务为什么会被kill 掉呢??
执行命令:
dmesg -T |grep -i kill
2、分析原因 是内存溢出导致的,那么到底是不是我的服务引起的还没有准确地定位到。接下来我需要看一下gc日志。
名词解释:
GC:
表明进行了一次垃圾回收,前面没有Full修饰,表明这是一次Minor GC ,注意它不表示只GC新生代,并且现有的不管是新生代还是老年代都会STW(Stop-The-World)。
Allocation Failure:
YGC 时间过长
Times:real>>user+sys 因此导致失败
ParNew:
表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX:ParallelGCThreads参数限制)。该收集器采用复制算法回收内存,期间会停止其他工作线程,即Stop The World。
668904K->36553K(670720K):单位是KB
三个参数分别为:GC前该内存区域(这里是年轻代)使用容量,GC后该内存区域使用容量,该内存区域总容量。
1.8041769 -0.8094076 secs : 该内存区域GC耗时,单位是秒
803975K->171624K(1526784K):三个参数分别为:堆区垃圾回收前的大小,堆区垃圾回收后的大小,堆区总大小。
0.8094076 secs:该内存区域GC耗时,单位是秒。
[Times: user=0.06 sys=0.00, real=0.81 secs]:分别表示用户态耗时,内核态耗时和总耗时