在JAVA开发与运维中,经常会遇见一些需要监控JVM性能的问题。例如
* 内存不足
* 线程死锁
* java进程消耗CPU过高
jps
可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数
命令格式:
jps [ options ]
options :
-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
-v 输出传给JVM的参数。
jinfo
用来查看正在运行的java应用程序的扩展参数(JVM中-X标示的参数);支持在运行时修改部分参数。
格式
jinfo [ option ] pid
jinfo [ option ] executable core
参数说明
pid 对应jvm的进程id
executable core 产生core dump文件
options:
no option 输出全部的参数和系统属性
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性
使用 java -XX:+PrintFlagsFinal -version|grep manageable 能看到JVM中哪些flag可以被jinfo动态修改
举例 : 正在运行的JVM中动态开启GC日志功能:
jinfo -flag +PrintGCDetails pid
jinfo -flag +PrintGC pid
jstack
主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如 死锁 CPU彪高,程序卡住,系统无响应,居家必备之良药)
格式
jstack [ option ] pid
jstack [ option ] executable core
options:
-F 强制dump线程堆栈信息. 用于进程hung住, jstack 命令没有响应的情况
-m 同时打印java和本地(native)线程栈信息,m是mixed mode的简写
-l 打印锁的额外信息
线程状态 我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态: NEW,未启动的。不会出现在Dump中。 RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。 BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。 WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。 TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。 TERMINATED,已退出的。 https://www.cnblogs.com/kongzhongqijing/articles/3630264.html
jmap
可以输出所有内存中对象的,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程内存使用状况,以及对象数量。
格式
jmap [ option ] pid
jmap [ option ] executable core
options:
-dump:[live,]format=b,file=
使用hprof二进制形式,输出jvm的heap内容到文件. live子选项是可选的,假如指定live选项,
那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息.加上live子参数,只统计活的对象数量.
-clstats 打印类加载器的统计信息(取代了在JDK8之前打印类加载器信息的permstat)
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-J 传递参数给jmap启动的jvm.
jhat
主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
导出堆 :
1) jmap 导出
2) -XX:+HeapDumpOnOutOfMemoryError
3) hprof
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
https://www.cnblogs.com/myna/p/7590620.html
jstat
用来监视VM内存内的各种堆和非堆的大小及其内存使用量。详细查看堆内各个部分的使用量,以及加载类的数量。
格式
jstat - [-t] [-h] [ []]
-t 可以在打印的列加上Timestamp列,用于显示系统运行的时间 -h 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头 interval 间隔时间,单位为毫秒 count 用于指定输出多少次记录,缺省则会一直打印
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
https://www.jianshu.com/p/213710fb9e40
https://www.cnblogs.com/myna/p/7590620.html
jconsole
生产环境不要开放
它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。
JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。
通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等
https://www.cnblogs.com/baihuitestsoftware/articles/6405580.html
https://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html