Skip to content

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 <pid>命令没有响应的情况 -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=<filename>
使用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.htmlhttps://www.cnblogs.com/myna/p/7590620.html

jstat

用来监视VM内存内的各种堆和非堆的大小及其内存使用量。详细查看堆内各个部分的使用量,以及加载类的数量。 格式 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

-t	可以在打印的列加上Timestamp列,用于显示系统运行的时间
-h	可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头

interval 间隔时间,单位为毫秒 count 用于指定输出多少次记录,缺省则会一直打印

https://www.cnblogs.com/baihuitestsoftware/articles/6406271.htmlhttps://www.jianshu.com/p/213710fb9e40https://www.cnblogs.com/myna/p/7590620.html

jconsole

生产环境不要开放

它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。 JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。 通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等

https://www.cnblogs.com/baihuitestsoftware/articles/6405580.htmlhttps://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html

本内容仅限内部使用,技术细节以实际代码为准