场景
记录JVM中常用工具。
jps:虚拟机进程状态工具
jps(JVM Process Status Tool):虚拟机进程状态工具,可以列出正在运行的虚拟机进程,
并显示虚拟机执行主类(Main Class,main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID。
命令格式:
jps [options] [hostid]
示例:
jps -l
选项:
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给main()函数的参数
-l 输出主类的全名,如果进程执行的是jar包,输出jar路径
-v 输出虚拟机进程启动时JVM参数
jstat:虚拟机统计信息监控工具
用于监控虚拟机各种运行状态信息的命令行工具。
它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,
它是运行期定位虚拟机性能问题的首选工具。
语法:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
示例:
jstat -gcutil 27024 5000 10
以上代表5000毫秒执行一次,一共执行10次,查看id为27024的gcutil对应选项的信息。
选项:
-class 监视类装载、卸载数量、中空间及类装载所耗费的时间
-gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等容量、已用空间、GC合计时间等信息
-gccapacity 监视内容与-gc基本相同,但输出主要关注java堆各区域使用到的最大和最小空间
-gcutil 监控内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew 监视新生代GC的状况
-gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间
-gcold 监视老年代GC的状况
-gcoldcapacity 监视内容与-gcold基本相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity 输出永久代使用到的最大和最小空间
-compiler 输出JIT编译器编译过的方法、耗时等信息
-printcompilation 输出已被JIT编译的方法
jinfo:jvm配置信息工具
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机的各项参数。
使用jps -v 可以查看虚拟机启动时显示指定的参数列表,但是如果想知道未被显示指定的参数的系统默认值,
除了去找资料外,就只能使用jinfo的-flag选项进行查询了。
命令格式:
jinfo [options] pid
选项:
-flags:查看JVM运行时环境参数;
-sysprops:查看JVM系统属性;
-classloader:查看JVM中已加载的类加载器信息;
-jvmflags:查看JVM启动时的参数;
-heap:查看JVM堆内存信息;
啥也不加:查看以上所有
示例:
jmap:java内存映射工具
jdk安装后会自带一些小工具,jmap命令(Memory Map for Java)是其中之一。
主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,
检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。
格式:
jmap [option] pid
选项:
-dump 生成java堆转储快照,格式为:-dump:[live,]format=b,file=<filename>,其中live子参数说明是否只dump出存活对象
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象,只在linux/solaris平台下有效
-heap 显示堆详细信息,如使用哪种回收期、参数配置、分带状况等,只在linux/solaris平台下有效
-histo 显示堆中对象统计信息,包括类、实例数量和合计容量
-permstat 以ClassLoader为统计口径显示永久代内存状况,只在linux/solaris平台下有效
-F 当虚拟机进程对-dump选项没有响应时,可以使用这个选项强制生成dump快照,只在linux/solaris平台下有效
示例:
jhat:虚拟机堆转储快照分析工具
jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,
包括对象的数量,大小等等,并支持对象查询语言。
使用jmap等方法生成java的堆文件后,使用其进行分析。
使用jmap生成java的堆文件
jmap-dump:format=b,file=D:/1.hprof 27024
然后分析堆文件
jhat D:/1.hprof
成功后访问7000端口
jstack:java堆栈跟踪工具
jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,
如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式:
jstack [-l] pid
主要分为两个功能:
针对活着的进程做本地的或远程的线程dump
针对core文件做线程dump
jstack用于生成java虚拟机当前时刻的线程快照。
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,
如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,
从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息,
如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
基本参数:
-F 当’jstack [-l] pid’没有响应的时候,强制打印线程堆栈信息,一般情况不需要使用
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用,一般情况不需要使用
-m 打印java和native c/c++框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
-h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询
示例:
jstack -l 27024
jconsole:Java监视与管理控制台
JConsole(java monitoring and management console)是一款基于JMX的可视化监视和管理工具。
使用:
点击JDK/bin 目录下面的“jconsole.exe”即可启动
然后会自动自动搜索本机运行的所有虚拟机进程
选择其中一个进程可开始进行监控
具体流程可参考下文
Java中数据同步-synchronized关键字与Mointor的使用:
Java中数据同步-synchronized关键字与Mointor(jconsole)的使用_@taskexceptionmointor_霸道流氓气质的博客-CSDN博客
jvisualvm:Java多合一故障处理工具
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,
对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、
执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。
VisualVM位于{JAVA_HOME}/bin目录中。
点击jvisualvm.exe启动