临河可以做网站的公司,wap网站多少钱,建筑安全员证查询官网,可以自己做装修效果图的网站介绍
在生产环境中#xff0c;经常会遇到各种各样奇葩的性能问题#xff0c;所以掌握最基本的JVM命令行监控工具还是很有必要的
名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用…介绍
在生产环境中经常会遇到各种各样奇葩的性能问题所以掌握最基本的JVM命令行监控工具还是很有必要的
名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用于分析heapdump文件
jps查看正在运行的Java进程
jps可以列出正在运行的Java进程并显示虚拟机执行主类Main Classmain()函数所在的类名称以及进程id
「如果想看一个命令的后面加 -help参数即可」
[rootVM-0-14-centos ~]# jps -help
usage: jps [-help]jps [-q] [-mlvV] [hostid]Definitions:hostid: hostname[:port]「可以看到可以监控远程服务但是基于安全考虑一般不使用」
常见的选项如下
选项作用-q只输出进程id-m输出传递给主类main函数的参数-l输出主类全类名如果进程执行的是Jar包输出jar包名字-v程序启动时指定的jvm参数
rootlocalhost:~$ jps
70208 KmpService
183525 LinkAnalysisServer
25160 MipSerachServerrootlocalhost:~$ jps -l
70208 com.st.kmp.main.KmpService
183525 com.st.cis.main.LinkAnalysisServer
25160 com.st.cis.main.MipSerachServerjstack打印线程快照
「查看某个Java进程中所有线程的状态。一般用来定位线程出现长时间停顿的原因如发生死循环死锁请求外部资源长时间等待等」
public class DeadLockDemo {private static Object lockA new Object();private static Object lockB new Object();public static void main(String[] args) {Thread threadA new Thread(() - {synchronized (lockA) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(get lockA);synchronized (lockB) {System.out.println(threadA run finish);}}});Thread threadB new Thread(() - {synchronized (lockB) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(get lockB);synchronized (lockA) {System.out.println(threadB run finish);}}});threadA.setName(myThreadA);threadB.setName(myThreadB);threadA.start();threadB.start();}
}「写了一个死锁的例子启动后执行jps找到进程id为19457」
rootlocalhost ~ % jps
19457 DeadLockDemo
19458 Launcher
2658
19459 Jps接着执行如下命令列出了这个进程每个线程的执行状态
jstack 19457「从图中可以看到有很多线程GC线程myThreadAmyThreadB等其中myThreadA和myThreadB的线程状态为BLOCKED并且在最后提示出了死锁发生的位置」
jmap导出堆内存映像文件
「jmap主要用来用来导出堆内存映像文件看是否发生内存泄露等。」
生产环境一般会配置如下参数让虚拟机在OOM异常出现之后自动生成dump文件
-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/Users/peng执行如下命令即可手动获得dump文件
jmap -dump:file文件名.dump 进程id「分析堆内存的工具有很多如Java VisualVMjhat等。」
jstat查看jvm统计信息
「jstat可以显示本地或者远程虚拟机进程中的类装载、 内存、 垃圾收集、 JIT编译等运行数据」
用jstat查看一下类装载的信息。一般很少使用这个命令命令行看垃圾收集信息真不如看图形界面方便就不多做介绍了。
[rootVM-0-14-centos ~]# jstat -class 19402
Loaded Bytes Unloaded Bytes Time 10229 19679.1 52 76.0 5.33含义如下
Loaded解释Loaded加载类的个数Bytes加载类的字节数Unloaded卸载类的个数Bytes卸载类的字节数Time花费的时间
jinfo实时查看和修改jvm配置参数
jinfo的作用是实时地查看和修改虚拟机各项参数。
「使用jps命令的**-v**参数可以查看虚拟机启动时显式指定的参数列表」但如果想知道未被显式指定的参数的系统默认值除了去找资料外就只能使用jinfo的-flag选项进行查询了如果只限于JDK 1.6或以上版本的话使用java -XX:PrintFlagsFinal查看参数默认值也是一个很好的选择 「**jinfo flags pid**在高版本才能正常使用在jdk1.8这个版本不能正常使用」
应用程序设置如下参数
-Xmx10m -Xms10m查看最大堆内存和是否打印GC日志可以看到不打印GC日志 接着设置打印GC日志再次查看打印GC日志
rootlocalhost ~ % jinfo -flag MaxHeapSize 20253
-XX:MaxHeapSize10485760
rootlocalhost ~ % jinfo -flag PrintGCDetails 20253
-XX:-PrintGCDetails
rootlocalhost ~ % jinfo -flag PrintGCDetails 20253
rootlocalhost ~ % jinfo -flag PrintGCDetails 20253
-XX:PrintGCDetails「**Xmx**是**MaxHeapSize**的别名」