JVM性能监控

有时候我们会碰到下面这些问题:

  • OutOfMemoryError,内存不足
  • 内存泄露
  • 线程死锁
  • 锁争用(Lock Contention)
  • Java进程消耗CPU过高

这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。

一、 jps(Java Virtual Machine Process Status Tool)  

jps [options] [hostid]

 如果不指定hostid就默认为当前主机或服务器

(1) -q:只列出JVM进程的id,不展示进程的其他信息

> jps -q -v
26582
26586
26301
27983

(2) -m:输出传递到main方法的参数列表

(3) -l:输出此启动此继承的main方法所在的全package路径、或者JAR的文件路径

> jps -l
26582 org.apache.catalina.startup.Bootstrap
27991 sun.tools.jps.Jps
26586 org.jetbrains.jps.cmdline.Launcher
26301 org.jetbrains.plugins.scala.nailgun.NailgunRunner

(4) -v:输出JVM进程的系统参数,其中包括-D参数和JAVA_OPTS相关参数

>jps -v
18381 Bootstrap -Djava.util.logging.config.file=/opt/deploy/sample-tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms256m -Xmx256m -XX:NewSize=128m -XX:+DisableExplicitGC -Dlogs=/data/logs -Dcache=/opt/deploy/sample-tomcat/cache -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/vipkid/homework/logs/gc.log -Djava.endorsed.dirs=/opt/tomcat/endorsed -Djava.io.tmpdir=/opt/deploy/sample-tomcat/temp

、 jstat(JVM Statistics Monitoring tool)  

JVM统计数据监控工具,可以用来查看JVM中GC、类加载等信息

jstat [generalOptions | outputOptions vimd [interval [s|ms] [count]]]

generalOptions没有太大用,我们只需要知道使用“jstat -options”来查看可选参的列表,主要是outputOptions。

(1)-class:有关classLoader的行为统计

> jstat -class 26582
Loaded  Bytes  Unloaded  Bytes     Time
 13401 28013.1      381   574.4      23.57

loaded:已加载类的个数,bytes:已加载类的字节数,unloaded、bytes:已卸载类的个数和字节数,time:类加载和卸载耗时。

(2) -compiler:统计Hotspot中JIT(just-in-time)编译器的行为,(比较少用)

(3) -gc:堆GC的行为统计,通过此指令我们能了解heap各个区域的内存使用情况

>jstat -gc 26582 2s 100
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
63488.0 10240.0  0.0   10080.0 520192.0 259699.6 1398272.0  1272911.1  92352.0 89826.6 9984.0 9458.4   1089   24.631  11     25.624   50.255

新生代有三块:eden、survivor0、survivor1,其中

  • EC、S0C、S1C分别表示上述三个区的compacity(KB)
  • EU、S0U、S1U分表表示上述三个区的已使用空间
  • OC、OU表示救年老代的空间和使用量
  • PC、PU表示持久带的情况
  • YGC、YGCT分别表示新生代GC的次数和总时间
  • FGC、FGCT表示FULL GC的次数和总时间,GCT表示所有GC的总时间

通常我们可以根据这些参数来观察,JVM内存分布、GC的情况,以便进行调优。(对于互联网系统,通常YGC与FGC相差数倍,即极少的FGC,但是通常YGC会几分钟就会执行一次)

、 jstack

jstack主要用来查看某个Java进程内的线程堆栈信息.

jstack [option] pid
jstack [option] executable core
jstack [option] [[email protected]]remote-hostname-or-ip

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.

第一步:找出该进程内最耗费CPU的线程

top -Hp pid

  

TIME列就是各个Java线程耗费的CPU时间,显然CPU时间最长的是ID为2968的线程,用printf "%x\n" 2968 得到2968的十六进制值为b98,下面会用到.

第二步:用jstack输出进程2860的堆栈信息,然后根据线程ID的十六进制值grep,发下:

# jstack 2860 | grep b98
"SessionTracker" prio=10 tid=0x00007f55a44e4800 nid=0xb53 in Object.wait() [0x00007f558e06c000

可以看到CPU消耗在SessionTracker这个类的Object.wait(),于是就能很容易的定位到相关的代码了。

四、 jmap

通常可以用来查看当前JVM的内存中对象存活情况、跟踪对象创建过程等.

>jmap -heap 26832
using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 536870912 (512.0MB)
   NewSize                  = 178782208 (170.5MB)
   MaxNewSize               = 178782208 (170.5MB)
   OldSize                  = 358088704 (341.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 102760448 (98.0MB)
   used     = 54807000 (52.268028259277344MB)
   free     = 47953448 (45.731971740722656MB)
   53.33472271354831% used
From Space:
   capacity = 39321600 (37.5MB)
   used     = 7370120 (7.028694152832031MB)
   free     = 31951480 (30.47130584716797MB)
   18.743184407552082% used
To Space:
   capacity = 36700160 (35.0MB)
   used     = 0 (0.0MB)
   free     = 36700160 (35.0MB)
   0.0% used
PS Old Generation
   capacity = 358088704 (341.5MB)
   used     = 46609072 (44.44987487792969MB)
   free     = 311479632 (297.0501251220703MB)
   13.016068778310304% used

 -histo[:live]:根据每个java class类型,打印出相应类的实例个数、内存占用空间(bytes)的直方图,live选项表示只打印存活的对象个数(和占用空间);这个指令可以帮助我们关注JVM中某种class的实例个数和占用内存量,对分析内存消耗、OOM排查有很大帮助。

查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象:jmap -histo[:live] pid

>jmap -histo:live 30402

 num     #instances         #bytes  class name
----------------------------------------------
   1:        129824       15193328  [C
   2:          7631       13005088  [B
   3:        127333        3055992  java.lang.String
   4:         22984        1308592  [Ljava.lang.Object;
   5:         14557        1281016  java.lang.reflect.Method
   6:         39153        1252896  java.util.HashMap$Node
   7:          8843         997240  java.lang.Class
   8:          7260         982096  [Ljava.util.HashMap$Node;

  class name是对象类型,说明如下:

B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象

五、 jhat

用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。需要注意的是 dump出来的文件还可以用MAT、VisualVM等工具查看.

jmap进行dump命令格式如下:

jmap -dump:format=b,file=dumpFileName pid

如上例所示对进程ID为2860进行Dump:

[[email protected]]# jmap -dump:format=b,file=/home/dump.dat 2860
Dumping heap to /home/dump.dat ...
Heap dump file created

然后使用jhat来对上面dump出来的内容进行分析。

[[email protected] Desktop]# jhat -port 8888 /home/dump.dat
Reading from /home/dump.dat...
Dump file created Sat Aug 01 04:21:12 PDT 2015
Snapshot read, resolving...
Resolving 411123 objects...
Chasing references, expect 82 dots..................................................................................
Eliminating duplicate references..................................................................................
Snapshot resolved.
Started HTTP server on port 8888
Server is ready.

注意:如果Dump文件太大,可能需要加上-J-Xmx512m参数以指定最大堆内存,即jhat -J-Xmx512m -port 8888 /home/dump.dat。然后就可以在浏览器中输入主机地址:8888查看了。

时间: 2024-10-15 01:28:58

JVM性能监控的相关文章

第八章 JVM性能监控与故障处理工具(2)

注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处理工具 Jconsole visualVM 2.Jconsole 进入"E:\Java\jdk1.6\bin",双击"jconsole.exe",弹出如下框: 说明:这里列出了所有的JVM进程,一个Jconsole进程,一个eclipse(PID:4684),这相当于j

【008】【JVM——性能监控与故障处理工具】

 JVM--性能监控与故障处理工具 HotSpot虚拟机提供了许多虚拟机运行时调试工具,方便开发人员在应用运行时对虚拟机和应用性能进行监控和优化. jps:JVM Process Status Tool 显示指定系统内所有的HotSpot 虚拟机进程.并显示虚拟机执行主类(Main Class, main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID ( LVMID, Local Virtual Machine Identifier) . jps 命令格式:jps [ opti

JVM性能监控与故障处理工具

jdk为我们提供了一系列的jvm性能监控和故障处理工具,在这里根据学习进度进行整理记录.便于之后查阅 1.jps 虚拟机进程工具  类似于Linux系统中的ps命令,用于查看虚拟机进程,常用的有以下功能 jps -l    显示虚拟机进程id以及进程主类 jps -q  只显示进程id,不显示主类名称 jps -m  显示进程id以及传递给main的参数 jps -v 输出虚拟机进程启动时的jvm参数 2.jstat 虚拟机统计信息监视工具 该工具是用于监视虚拟机各种运行状态信息的命令行工具  

JAVA程序员养成计划之JVM学习笔记(3)-JVM性能监控

本文对JVM的性能监控方法做整理. 持续更新中- - 1. JDK命令行工具 1.1. jps:虚拟机进程状况工具 JVM Process Status Tool, 显示系统内所有的HotSpot虚拟机进程,用于查看当前在jvm中运行的程序,包括虚拟机执行主类的名称以及进程ID. 1.2. jstat:虚拟机统计信息监视工具 JVM Statistics Monitoring Tool, 用于收集Hotspot虚拟机各方面的运行数据,包括类装载.内存.垃圾收集.JIT编译等运行数据. 1.3.

jvm性能监控与GC调优

目录 一 提出问题 二 基于JDK命令行工具的监控 1. JVM的三种参数类型 1.1 标准参数 1.2 X 参数 1.3 XX 参数 1.4 常用命令 2. jstat查看虚拟机统计信息 2.1 类加载信息 2.2 垃圾回收信息 2.3 JIT编译信息 3. jmap + MAT分析内存溢出 [实战] 3.1 模拟内存溢出 3.2 导出内存影像文件 3.3 使用MAT分析dump文件 4. jstack分析死循环与死锁 [实战] 三 基于JVisualVM的可视化监控 四 基于Btrace的监

第七章 JVM性能监控与故障处理工具(1)

1.定位系统问题 依据 GC日志 堆转储快照(heapdump/hprof文件) 线程快照(threaddump/javacore文件) 运行日志 异常堆栈 分析依据的工具 jps:显示指定系统内的所有JVM进程 jstat:收集JVM各方面的运行数据 jinfo:显示JVM配置信息 jmap:形成堆转储快照(heapdump文件) jhat:分析heapdump文件 jstack:显示JVM的线程快照 jconsole visualVM 说明:后边两种是具有图形化界面的. 2.jps(是其他所

JProfiler jvm性能监控软件使用以及监控思路

. 一.JProfiler 安装 参考https://blog.csdn.net/baidu_19473529/article/details/72724114 二.JProfiler 软解介绍: Telemetries:遥测 该模块是对应用服务监控数据的一个图表概览 1.  Overview:概览,该以图表形式汇总了当前应用服务器的资源使用情况 2.  Memory:内存占用,统计内存已使用和空闲的空间 3.  Record Objects:堆实例对象记录,以数组和非数组形式来分类记录堆上的对

JVM性能监控命令

jps:    主要用来输出JVM中运行的进程状态信息    option:        -q 忽略输出的类名.Jar名以及传递给main方法的参数,只输出pid.        -m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null.        -l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径.        -v 输出传给JVM的参数.        -V 输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flag

服务性能监控指标

Apache性能监控支持以下指标: Apache吞吐率 Apache并发连接数 Apache并发连接数详细统计,包括读取请求.持久连接.发送响应内容.关闭连接.等待连接 Lighttpd性能监控支持以下指标: Lighttpd吞吐率 Lighttpd并发连接数 Lighttpd并发连接数详细统计,包括建立连接.读取请求.读取POST数据.处理请求.发送响应内容.关闭连接 Nginx性能监控支持以下指标: Nginx吞吐率 Nginx并发连接数 Nginx并发连接数详细统计,包括读取请求.处理请求