常见JVM分析工具的使用

常见的jvm分析工具

一、CLI(Command Line interface)

1.1 jps(java process status)

jps:Java Virtual Machine Process Status Tool
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
jps [ options ] [ hostid ]
-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m -m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
-v 输出传递给JVM的参数
jps host
查看host的jps情况(前提:host提供jstatd服务)

1.2jstatd(了解)

jstatd:Virtual Machine jstat Daemon
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html
jstatd [ options ]
启动jvm监控服务。它是一个基于rmi(远程接口调用)的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。-p指定端口。
实例:jstatd -J-Djava.security.policy=my.policy &
my.policy文件需要自己建立,内如如下:
grant codebase “file:${java.home}/…/lib/tools.jar” { permission java.security.AllPermission; };
这是安全策略文件,因为jdk对jvm做了jaas(Java验证和授权API)的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作;

1.3 jmap

​ Memory Map 观察运行中的jvm物理内存的占用情况。
官方地址: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html

jmap [ option ] pid
pid   进程号(常用)
参数如下:
-heap:打印jvm heap的情况(垃圾收集器类型)
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只打印存活对象的情况
-permstat:打印permanent generation heap(方法区)情况(在jdk1.8之后不存在方法区)
-finalizerinfo:打印正等候回收的对象信息

实例:

?:
[bigdata@bigdata01 jvm]$ jmap -heap 8580
Attaching to process ID 8580, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
 
using thread-local object allocation.
Parallel GC with 4 thread(s)
-Xms:500m -Xmx:1000m    500M <= 堆空间 <= 1000m
Heap Configuration:
   MinHeapFreeRatio         = 0                        ---->堆最小的空闲比例,此时堆的空间大小是多少:也就是说堆空间被占满,显然就是1000m
   MaxHeapFreeRatio         = 100                ---->堆最大的空闲比例,此时堆的空间大小是多少? 也就是说堆空间使用最小内存,显然就是500m
   MaxHeapSize              = 1048576000 (1000.0MB)        堆的最大空间大小
   NewSize                  = 21495808 (20.5MB)                新生代初始化空间大小
   MaxNewSize               = 349175808 (333.0MB)        新生代最大空间大小
   OldSize                  = 43515904 (41.5MB)                老年代的初始化空间大小
   NewRatio                 = 2                        老年代和新生代的内存空间比例=21,加入调整为3-->-XX:NewRatio=3
   SurvivorRatio            = 8                                                Eden区和survivor空间比例:8:1:1
   MetaspaceSize            = 21807104 (20.796875MB) jdk1.8之后叫做元数据区,就是jdk1.8以前的PermSize, 初始化空间大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB)                压缩的类的空间大小
   MaxMetaspaceSize         = 17592186044415 MB                对应的最大空间大小
   G1HeapRegionSize         = 0 (0.0MB)
 
Heap Usage:
PS Young Generation                新生代
Eden Space:
   capacity = 73400320 (70.0MB)                容量
   used     = 11939112 (11.386024475097656MB) 已用大小
   free     = 61461208 (58.613975524902344MB)        空闲大小
   16.26574925013951% used
From Space:
   capacity = 4194304 (4.0MB)
   used     = 131072 (0.125MB)
   free     = 4063232 (3.875MB)
   3.125% used
To Space:
   capacity = 6815744 (6.5MB)
   used     = 0 (0.0MB)
   free     = 6815744 (6.5MB)
   0.0% used
PS Old Generation                老年代
   capacity = 76546048 (73.0MB)
   used     = 51528752 (49.14164733886719MB)
   free     = 25017296 (23.858352661132812MB)
   67.31732512173588% used
 
16790 interned Strings occupying 1695440 bytes.

用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:
jmap -dump:format=b,file=dumpFileName pid
jmap -dump:format=b,file=4574.heap20151215 4574

Dumping heap to 4574.heap20151215
Heap dump file created

dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:
jhat -port 9998 /tmp/dump.dat
注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在浏览器中输入主机地址:9998查看了。
注意:-J-Xmx512m中间没有空格。

1.4jinfo(了解)

Configuration Info
官方地址: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html

jinfo [ option ] pid
pid   进程号
参数如下:
no option  打印命令行参数和系统属性
-flags  打印命令行参数
-sysprops  打印系统属性
-h  帮助

这里唯一需要大家知道的是,我们经常通过-D来给jvm传递自定以的系统参数:
[外链图片转存失败(img-5p2M26Wt-1562287455857)(assets/1561516520725.png)]

后台通过System.properties来获得这个参数,进而进行下一步的操作:
[外链图片转存失败(img-nONHe07G-1562287455860)(assets/1561516559204.png)]

1.5jstack

jstack:Stack Trace
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况
jstack [ option ] pid
[ option ] 参数如下
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有栈信息.

tid指Java Thread id。nid指native线程的id。prio是线程优先级。[0x00007fd4f8684000]是线程栈起始地址

dump 文件里,值得关注的线程状态有:

死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)

执行中,Runnable
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
停止,Parked

1.6jstat

jstat: Java Virtual Machine Statistics Monitoring Tool
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
Usage: jstat -help|-options
jstat - [-t] [-h] [<interva[s|ms]> []]
参数解释:
Options — 选项,我们一般使用 -gcutil /-gc 查看gc情况
pid — VM的进程号,即当前运行的java进程号
interval[s|ms] —— 间隔时间,单位为秒或者毫秒,默认为ms。必须是正整型。
count — 打印次数,如果缺省则打印无数次
例如:jstat -gc 4645 500 10 表示查看进程号为4645的gc 每500ms打印一次 共打印10次
[外链图片转存失败(img-IEGUql9E-1562287455861)(assets/1561518473717.png)]

参数说明:

S0C                --->survivor-0 capacity
S1C                --->survivor-1 capacity                
S0U                --->survivor-0 used
S1U                --->survivor-1 used
EC                --->eden capacity
EU                --->eden used
OC                --->old generation capacity
OU                --->old generation used
MC                --->metaspace capacity/jdk1.8以前叫PC        
MU                --->metaspace used/jdk1.8以前叫PU
CCSC        --->compressed class space capacity
CCSU        --->compressed class space used
YGC                --->截止到目前为止总共执行了多少次ygc(minor gc)
YGCT        --->截止到目前为止总共执行ygc消耗的时间(单位秒)        
FGC                --->截止到目前为止总共执行了多少次fullgc(minor gc)        
FGCT        --->截止到目前为止总共执行fullgc消耗的时间(单位秒)        
GCT           --->截止到目前为止所有gc消耗的时间(单位秒)

二、GUI(Graph User Interface)

1、 jconsole

可视化的jvm监控软件。
可以监控本地或者远程进程。
主要包括:概览、内存、线程、类、VM概要、MBean选项卡。
概览选项卡:呈现四幅图表:主要包括堆内存使用量、类、线程、CPU占有率。
内存选项卡:包含堆内、非堆、内存池的使用量图表和详细信息。相当于jstat命令。
线程选项卡:显示所有的线程的信息和图表。相当于jstack
类选项卡:加载的类的信息。
Vm概要:VM的概要信息包括堆大小,垃圾收集信息、vm参数等。
Mbean选项:managed beans ,被管理的beans

2、jvisualvm

多合一故障处理工具
visual vm是迄今为止,jdk发布的功能最强大的运行监视和故障处理程序。可以查看本地和远程的的状态。
优点:不需要被监控的程序基于特殊的Agent运行,因此他对应用程序的实际性能影响很小,这样他可以直接运行在生产环境中。这是其它监视工具比如:jprofile、yourkit无法与之相比的。

visualvm.exe
主要特点:
1、插件安装。
2、生成、浏览堆转储快照和线程快照。
3、抽样器和profiler中分析程序性能。
4、BTrace插件动态日志跟踪。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值