JVM调优工具
1、JVM调优工具-JDK工具
1.1 jps
jps:Java Virtual Machine Process Status Tool
查看java进程,相当于Linux下的ps命令,只不过它只能列出Java进程
jps:列出Java程序进程的ID和Main函数名称
jps -q: 只输出集成ID
jps -m: 输出传递给Java进程(主函数)的参数
jps -l: 输出主函数的完整路径
jps -v: 显示传递给Java虚拟的参数
image.png
1.2 jstat
jstat:JVM Statistics Monitoring Tool jvm信息统计监控工具
jstat可以查看Java程序运行时相关信息,可以通过它查看堆信息的相关情况
jstat -<option> [-t] [-h<lines>] <vmid> [<interval>] [<count>]
options:由以下值构成
- class (类加载器)
- compiler (JIT)
- gc (GC堆状态)
- gccapacity (各区大小)
- gccause (最近一次GC统计和原因)
- gcnew (新区统计)
- gcnewcapacity (新区大小)
- gcold (老区统计)
- gcoldcapacity (老区大小)
- gcpermcapacity (永久区大小)
- gcutil (GC统计汇总)
- printcompilation (HotSpot编译统计)
- interval(用于指定输出统计数据的周期,单位是毫秒)
- count(用于指定一个输出多少次数据)
示例1
下面输出的GC信息,10416:进程ID 250:250毫秒 4:采样本数为4次
jstat -gc 10416 250 4
image.png
具体描述
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC :Old代的容量 (字节)
OU :Old代目前已使用空间 (字节)
PC :Perm(持久代)的容量 (字节)
PU :Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT :从应用程序启动到采样时gc用的总时间(s)
示例2
jstat -calss 10416
image.png
具体描述:
loaded:已经装在的类的数量
Bytes :装载类所占用的字节数
Unloaded:已经卸载类的数量
Bytes:卸载类的字节数
示例3
jstat -gcutil 10416 5s 5
image.png
1.3 jinfo
jinfo:Java configuration info
jinfo可以用来查看正在运行的java程序的扩展参数,甚至支持运行时,修改部分参数
jinfo [option] <pid>
1.4 jmap
jmap:Java Memory Map
jmap用来查看堆内存使用状况,一般结合jhat使用
示例1 heap
命令:jmap -heap pid
描述:显示Java堆详细信息
打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存分配情况
示例2 histo[:live]
命令:jmap -histo:live pid
描述:显示堆中对象的统计信息
其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个*前缀,如果ja 指定了live子选项,则只计算活动的对象
示例3 clstats
命令:jmap -clstats pid
描述:打印类加载器信息
示例4 finalizerinfo
命令:jmap -finalizerinfo pid
描述:打印等待终结的对象信息
示例5 dump 结合下面的jhat使用
命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆转储快照dump文件
注意
phrof二进制格式转储指定filename的文件中。live子选项是可选的,如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(java堆分析工具)读取生成的文件
这个命令执行,jvm会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用,线上系统慎用
1.5 jhat
jhat:java Heap Analysis Tool ,jhat命令解析ajva对转储文件,并启动一个web server。然后用浏览器来查看浏览dump出来的heap。jhat 命令支持预先设计的查询,比如显示某个类的所有实例。还支持查询语言(OQL Obejct Query Language)。OQL有点类似Sql,专门用来查询堆转储。OQL相关的帮助信息可以在jhat命令所提供的服务器页面最底部,如果使用默认端口,则OQL帮助信息页面为:http://localhost:7000/oqlhelp/
1.6 jstack
命令:jstack -l pid > jstack_info.txt
jstack:java Stack Trace,jstack是Java虚拟机只带的一种堆栈跟踪工具。jstack用于生产java虚拟机当前时刻的线程快照。线程快照是当前Java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有相应的线程到底在后台做什么事情,或者等待什么资源。如果Java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和natice stack的信息,从而可以轻松的知道java程序是如何崩溃和在程序何处发生问题,另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
在thread dump中,要留意下面几种状态
-
死锁,DeadLock(重点关注)
-
等待资源 Waiting on condition(重点关注)
-
等待获取监视器 Waiting on monitor entrty(重点关注)
-
阻塞 Blocked(重点关注)
-
执行中 Runnable
-
暂停 Suspended
-
对象等待中 Object.wait()或TIMED_WAITING
-
停止 Parked
示例1
统计线程数
jstack -l pid |grep 'java.lang.Thread.State' | wc -l
1.7 jconsole
jconsole:Java Monitoring and Management Console,Java 5引入,一个内置Java性能分析器,可以从命令行或者GUI Shell中运行。可以轻松地使用Jconsole来监控Java应用程序性能和跟踪Java中的代码
如何启动Jconsole
如果是命令行启动,使用JDK在PATH上,运行jconsole即可
如果在GUI Shell启动,找到JDK安装路径,打开bin目录,双击jconsole
当分析工具弹出时(取决于正在运行的java版本以及正在运行的java程序数量),可能会出现一个对话框,要求输入一个进程的URL来连接,也可能累出许多不同的本地java进程(有时包含jconsole进程本身)来连接。如下图所示:想分析哪个进程就双击哪个进程
1.8 hprof
hprof:Heap/CPU profiling Tool 能够展现CPU使用率,统计堆内存使用情况
JVM调优工具-Linux工具
2.1 top
Linux中的top命令显示系统上正在运行的进程,他是系统管理员最重要的工具之一,被广泛用于监视服务器的负载。top命令是一个交互命令,在运行top的时候还可以运行很多命令
top的使用方式 top [-d number] | top [-bnp]
top:显示进程信息
top -c : 显示完整命令
top -b :以批处理模式显示程序信息
: 以累计模式显示程序信息
2.2 vmstat
Virtual Meomory Statisctics (虚拟内存统计),可对炒作系统的虚拟内存、进程、CPU活动进行监控
vmstat 3 每三秒监控一次
2.3 iostat
需要安装
2.4 pidstat
需要安装
JVM调优工具-第三方工具
3.1 VisualVM
需要手动安装对应插件
3.2 MAT
Memory Analyzer Tool
eclipse或idea上可以下载插件。有时候dump文件太大的话,可以下载LInux的MAT。
3.3 GCWviewer
3.4 Arthas
alibaba开源的java诊断工具,下载jar包,然后运行。
网友评论