在JVM页面查看主机上运行的Java虚拟机的内存、线程、CPU性能数据,掌握Java虚拟机中每个进程运行时的资源使用情况,可以帮助发现以下性能问题:
内存持续增长,如果内存持续增长有可能会导致内存溢出。
频繁的完全垃圾回收,JVM在完全垃圾回收时会使所有正在运行的程序停顿,直至垃圾回收完毕,此段时间内,应用系统的响应就会变慢。
发现互相死锁的线程。
监控线程中的代码堆栈执行时间。
监控所有线程状态、CPU使用率。要特别注意,长时间处于Blocked、Waiting和Timed_Waiting状态的线程,其阻塞和等待的代码处会有潜在的性能问题,根据我们统计出来的这些状态的线程,用户可以用jstack命令,具体检查阻塞和等待的代码。
内存分析
堆&垃圾回收
在“堆&垃圾回收”页面查看内存使用状态的概要信息、内存及垃圾回收变化趋势。
1)内存使用状态
在内存使用状态的概要信息中查看内存平均使用率、最近5分钟使用率、内存大小。
2)Heap memory和No Heap memory
查看Heap memory(堆内存)和No Heap memory(非堆内存)在一段时间内的变化趋势,包括Usage、MAX、Commited。
堆的持续增长意味着潜在的内存泄漏或溢出,通过变化趋势图发现潜在风险。
3)垃圾回收
在GC-Avg Count和GC-Avg Time这两个垃圾回收图表中,关注完全回收的次数和时间,因为它影响到系统的响应时间。不同的垃圾回收器,其完全回收的名字不一样。
Memory Pool
在Memory Pool(内存池)中查看内存使用状态及变化趋势。不同的垃圾回收器,其各个内存的名字不一样。
对象实例跟踪
在对象实例跟踪页面查看每个对象运行的对象实例数、对象占用内存大小及对象实例的变化趋势。
线程分析
在线程页面查看所有线程的运行状态和各性能指标数据,不同状态的线程用不同颜色标记。
其中,CpuTime是指从线程启动到现在为止共运行的时间;Cpu则是以jvm_period为周期,在这个周期内,该线程执行的CpuTime占jvm_period的百分比。
要特别注意,长时间处于Blocked、Waiting和Timed_Waiting状态的线程,其阻塞和等待的代码处会有潜在的性能问题,根据我们统计出来的这些状态的线程,用户可以用jstack命令,具体检查阻塞和等待的代码。
通过线程的运行状态能够发现死锁问题,但没有必要实时监控线程,不需要监控时在配置文件中将dumpThread配置为false即可。
CPU分析
在CPU页面查看监控进程的CPU时间即代码执行时间,包括前后台线程。配置的debugPackg越详细,线程内代码的执行时间越精确。
在“Thread List”中,点击线程名称查看线程的Call Tree即详细的方法调用树。
在“Call Tree”中,点击方法名称可查看该方法的父方法(Caller)及子方法(Callee)的执行时间。
此外,还可在“Hot Spots”中查看所有的方法的执行时间。
指标说明:
Time(ms):该方法自身及所有子方法的执行时间。
Time(%):该方法自身及所有子方法占父方法的执行时间比率。
SelfTime(ms):该方法自身的执行时间。
SelfTime(%):(SelfTime/ Time )* 100%