JVM工具

在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

原文地址:https://www.cnblogs.com/ymqj520/p/11378498.html