JVM故障分析及性能优化系列文章
前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章。
基本概念 {#basic-info}
在对Java内存泄漏进行分析的时候,需要对jvm运行期间的内存占用、线程执行等情况进行记录的dump文件,常用的主要有thread dump和heap dump。
thread dump 主要记录JVM在某一时刻各个线程执行的情况,以栈的形式显示,是一个文本文件。通过对thread dump文件可以分析出程序的问题出现在什么地方,从而定位具体的代码然后进行修正。thread dump需要结合占用系统资源的线程id进行分析才有意义。
heap dump 主要记录了在某一时刻JVM堆中对象使用的情况,即某个时刻JVM堆的快照,是一个二进制文件,主要用于分析哪些对象占用了太对的堆空间,从而发现导致内存泄漏的对象。
上面两种dump文件都具有实时性,因此需要在服务器出现问题的时候生成,并且多生成几个文件,方便进行对比分析。下面我们先来说一下如何生成 thread dump。
使用jstack生成thread dump
当服务器出现高CPU的时候,首先执行 top -c 命令动态显示进程及占用资源的排行,如下图:
top后面的参数-c可以显示进程详细的信息。top命令执行的时候还可以执行一些快捷键:
1 对于多核服务器,可以显示各个CPU占用资源的情况
shift+h 显示所有的线程信息
shift+w 将当前 top