jvm内存监视工具

1.jps命令
jps(Java Virtual Machine Process Status Tool)
作用:用于输出JVM进程状态信息
例如:
jvm内存监视工具_第1张图片
-q:只输出进程 ID
-m:输出传入 main 方法的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数


2.jmap
作用:监控内存内的Java对象

常用命令(1) jmap -histo 6892
jvm内存监视工具_第2张图片
该命令打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象。这个例子是打印eclipse软件在内存中的对象
在这里插入图片描述

(2).jmap -heap 6892
打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
例如:jvm内存监视工具_第3张图片
(图太长了,这只是冰山一角)

(3.)-finalizerinfo 打印等待回收的对象信息
例如:
jvm内存监视工具_第4张图片
Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象。
(4.)-dump
以hprof二进制格式将Java堆信息输出到文件内
例如:
在这里插入图片描述


3.jhat
用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
(1)、导出堆文件:
jmap -dump:live,file=D:\heap.log pid
例如:
在这里插入图片描述
(2)、分析堆文件:
jhat -J-Xmx512m 解析Java堆转储文件,并启动一个 web server;
说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误,可添加-J-Xmx512M参数;
jhat -J-Xmx512M D:\heap.log
例如:
jvm内存监视工具_第5张图片
(3)、查看html:在浏览器中输入主机地址:端口号(见上图红框框起部分):
jvm内存监视工具_第6张图片
说明:
All classes including platform 显示所有创建堆中对象的类
Show all members of the rootset 显示rootset能引用到的所有对象
Show instance counts for all classes (including platform) 显示所有类(包括JDK中定义的Java类)的实例数量
Show instance counts for all classes (excluding platform) 显示所有类(不包括JDK中定义的Java类)的实例数量
Show heap histogram 显示堆内对象直方图
Show finalizer summary 显示等待回收的对象信息
Execute Object Query Language (OQL) query 执行对象查询语句


4.jstack
jstack用于显示指定进程内线程的信息
语法:
jstack [option]
说明:
option:命令选项,常用选项如下:
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack),一般情况不需要使用
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用
-m打印java和native c/c++框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
pid:进程id

例如:
jvm内存监视工具_第7张图片

线程与Monitor

jvm内存监视工具_第8张图片

进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则进入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。
拥有者(The Owner):表示某一线程成功竞争到对象锁。
等待区(Wait Set) :表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。
说明:
一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程为“Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在“Wait Set”中等待的线程状态是 “in Object.wait()”。 被 synchronized保护起来的代码段称为临界区,当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。

线程状态:
1、NEW:线程刚刚被创建,也就是已经new过了,但是还没有调用start()方法,jstack命令不会列出处于此状态的线程信息。
2、RUNNABLE:RUNNABLE这个名字很具有欺骗性,很容易让人误以为处于这个状态的线程正在运行;事实上,这个状态只是表示,线程是可运行的。一个单核CPU在同一时刻,只能运行一个线程。
3、BLOCKED:线程处于阻塞状态,正在等待一个监视器锁(monitor lock)。通常情况下,是因为本线程与其他线程公用了一个锁。其他在线程正在使用这个锁进入某个synchronized同步方法块或者方法,而本线程进入这个同步代码块也需要这个锁,最终导致本线程处于阻塞状态。
4、WAITING:等待状态,等待某个condition或monitor发生,调用以下方法可能会导致一个线程处于等待状态:
wait() 不指定超时时间
join() 不指定超时时间
park()
5、TIMED_WAITING:线程等待指定的时间,对于以下方法的调用,可能会导致线程处于这个状态:
wait(long timeout) 指定超时时间
join(long millis) 指定超时时间
sleep(long millis) 指定超时时间
parkNanos(long nanos)
parkUntil(long deadline)
6、TERMINATED:线程终止。


5 jstat

jstat -

jvm内存监视工具_第9张图片
-t:timestamp简写,
-h:h是显示标题,lines代表一个整数,-h3表示每三行显示一次标题
vmid:VM进程号,即当前运行的Java进程号
interval:间隔多长时间统计一次,默认单位ms(毫秒),如果为s,则为秒
count:统计次数,如果省略,则统计无限次,但interval和count都省略,则只统计一次


6.VisualVM
是一款免费的性能分析工具,JDK自带的,在JDK安装目录bin下启动【jvisualvm.exe】即可

jvm内存监视工具_第10张图片
详细使用见:https://www.cnblogs.com/sxdcgaq8080/p/7156227.html
https://blog.csdn.net/boonya/article/details/69227692

你可能感兴趣的:(java)