引言
在 应用服务出现模型的卡顿或者CPU飙升等问题时,总是要分析一下对应的进程的JVM状态以定位问题和解决问题并做出响应的优化,在这个过程中java自带的一些状态监控 命令工具就非常方便了。
JDK中很多的小工具都参考 了unix的命名方式,jps 就是其中的典型。除了名称和UNIX中的ps相似之外,功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( main class,main()函数所在类)名称及这些进程的 本地虚拟机唯一id。
命令格式:
jps [options] [hostid]
options参数解释:
jps执行样例:
jstat命令式使用比较频繁的命令,主要用来显示 本地或者远程虚拟机中类装载、内存、垃圾收集、JIT编译等运行数据。 在没有GUI图形界面,只提供了纯文本的控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。
命令格式:
jstat [option] LVMID [interval ] [count]
其中LVMID是进程id,interval是打印间隔时间(毫秒),count是打印次数,如果省略这两个参数,说明只查询一次。
option参数解释:
选项 | 作用 |
---|---|
-class | 监视类装载,类卸载,总空间及类装载所消耗的时间 |
-gc | 监视java堆状况,包括Eden区,两个survivor区,老年代,永久代等容量、已经使用空间、GC时间合计信息 |
-gcutil | 监视内容与-gc基本相同,但是输出主要关注已使用空间站总空间的百分比 |
-gccapacity | 监视内容与-gc基本相同,但是输出主要关注java堆各个区域使用到的最大、最小空间 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcnew | 监视新生代的GC状况 |
-gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大最小空间 |
-gcold | 监视老年代GC状况 |
-gcoldcapacity | <br>监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间<br> |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-compiler | 输出JIT编译器编译过的方法、耗时等信息 |
-printcompilation | 输出已经被JIT编译的方法 |
例如需要 每250秒查询一次进程3900垃圾收集状况,一共查询20次,执行命令如下:
jstat -gc 3900 250 20
字段解释:
-gcutil和-gc参数类似,只不过输出字段不是实际值,而是百分比。
字段解释:
jinfo的作用是实时的查看和调整虚拟机 各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表。如果想知道未被显式指定的参数系统默认值,那就需要查找相关资料或者使用jinfo命令配合相关参数进行查看。
命令格式:
jinfo [option] <pid>
options:参数解释
常用示例展示:
1)、查看JVM参数和系统配置
jinfo 11666
jinfo -flags 11666
jinfo -sysprops 11666
2)、查看打印GC日志参数
jinfo -flag PrintGC 11666
jinfo -flag PrintGCDetails 11666
3)、关闭GC参数
jinfo -flag -PrintGC 11666
jinfo -flag -PrintGCDetails 11666
还可以使用下面的命令查看哪些参数可以使用jinfo命令来管理:
java -XX:+PrintFlagsFinal -version | ``grep
manageable
jmap是用来生成对dump文件和查看堆相关的各类信息命令,例如查看finalize执行队列,heap的详细信息和 使用情况。
命令格式:
jmap [option] <pid> (连接正在执行的进程)
jmap [option] <executable <core> (连接一个core文件)
jmap [option] [server_id@]<remote server IP or hostname> (链接远程服务器)
option参数解释:
dump-options:
live 只转储存活的对象,如果没有指定则转储所有对象
format=b 二进制格式
file=<file> 转储文件到 <file>
常用示例:
1)、jmap -dump:live,``format``=b,``file``=dump.hprof 11666
输出:
Dumping heap to ``/dump``.hprof ...
Heap dump ``file
created
这个命令是要把java堆中的存活对象信息转储到dump.hprof文件
2)、jmap -finalizerinfo 11666
输出:
Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Number of objects pending for finalization: 0
输出结果的含义为当前没有在等待执行finalizer方法的对象
3)、jmap -heap 11666
输出堆的详细信息
Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 22020096 (21.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的新生代的默认大小
MaxNewSize = 357564416 (341.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的新生代的最大大小
OldSize = 45088768 (43.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的老年代的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:新生代和老生代的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置新生代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB) // 元数据区大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) //类压缩空间大小
MaxMetaspaceSize = 17592186044415 MB //元数据区最大大小
G1HeapRegionSize = 0 (0.0MB) //G1垃圾收集器每个Region大小
Heap Usage: //堆内存使用情况
PS Young Generation
Eden Space: //Eden区内存分布
capacity = 17825792 (17.0MB) //Eden区总容量
used = 12704088 (12.115562438964844MB) //Eden区已使用
free = 5121704 (4.884437561035156MB) //Eden区剩余容量
71.26801434685203% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
capacity = 2097152 (2.0MB)
used = 1703936 (1.625MB)
free = 393216 (0.375MB)
81.25% used
To Space: //另一个Survivor区的内存分布
capacity = 2097152 (2.0MB)
used = 0 (0.0MB)
free = 2097152 (2.0MB)
0.0% used
PS Old Generation
capacity = 52428800 (50.0MB) //老年代容量
used = 28325712 (27.013504028320312MB) //老年代已使用
free = 24103088 (22.986495971679688MB) //老年代空闲
54.027008056640625% used //老年代使用比率
interned Strings occupying 2075304 bytes.
4)、jmap -histo:live 11666 | ``more
输出存活对象统计信息
输出:
num #instances #bytes class name
----------------------------------------------
1: 46608 1111232 java.lang.String
2: 6919 734516 java.lang.Class
3: 4787 536164 java.net.SocksSocketImpl
4: 15935 497100 java.util.concurrent.ConcurrentHashMap$Node
5: 28561 436016 java.lang.Object
jhat命令和jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个小型的HTTP/HTML服务器,生成dump分析结果后,可以在浏览器中进行查看。不过在实际环境中,很少有人会使用该命令就行快照分析,除非手头上别无选择。主要原因:一是一般不会在部署应用程序的服务器上直接分析 dump文件,即使可以这样做,也会尽量将dump文件复制到别的机器上完成分析,因为分析工作是一个耗时而且消耗硬件资源的过程。另一个原因就是jhat的分析功能相对来说比较简陋。
命令格式:
jhat [option] [dumpfile]
option参数解释:
0: 无debug输出
1: Debug hprof file parsing
2: Debug hprof file parsing, no server
jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈 集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁, 死循环等。jstack还可以查看 程序崩溃是生成的core文件中的stack信息。
命令格式:
jstack [option] vmid
option参数:
常用示例:
jstack -l 11666 | ``more
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode):
"Attach Listener" #25525 daemon prio=9 os_prio=0 tid=0x00007fd374002000 nid=0x70e8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
......
在JDK1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码完成jstack的大部分功能。
主要常用的有jconsole jvisualvm 相关的具体用法, 各位读者在具体的使用过程中 慢慢摸索就可以了。在这里就不过多的描述。
jvisualvm:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/u013045437/article/details/103475572
内容来源于网络,如有侵权,请联系作者删除!