第23章 JVM监控及诊断工具-命令行篇
来自尚硅谷宋红康老师讲解的JVM:bilibili链接
1 概述
- 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益。
- Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。
- 体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题
- 体会2:无监控、不调优!
-
简单命令行工具
在我们刚接触java学习的时候,大家肯定最先了解的两个命令就是 javac,java,那么除此之外,还有没有其他的命令可供我们使用呢?我们进入jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标JVM不同方面、不同层次的信息,帮助开发人员很好的解决Java应用程序的一些疑难杂症。
这些命令对应的源码地址:源码
2 jps:查看正在运行的Java进程
2.1 基本情况
-
jps:Java Process Status
显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。
2.2 测试
public class ScannerTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(system.in);
String info = scanner.next();
}
}
另外注意:每次jps执行都是一个新的进程
2.3 基本语法
-
jps的进本语法:jps [options] [hostid]
[options]:
- -q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等。
- -l:输出应用程序主类的全类名 或 如果执行的是jar包,则输出jar包的完整路径
- -m:输出虚拟机进程启动时传递给主类main()的参数
- -v:列出虚拟机进程启动时的JVM参数。比如:-xms100m -Xmx100m是启动程序指定的JVM参数
说明:以上参数可以综合使用。
补充:如果某Java进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该Java进程
在IDEA中配置参数如下:
执行:
jps -m > a.txt
在IDEA中配置参数如下:
执行:
jps -v > b.txt
[hostid]:
3 jstat:查看JVM的统计信息
3.1 基本情况
- jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息的命令工具。它可以显示本地或者远程虚拟机中的类装载、内存、垃圾收集、JIT编译等运行数据。
- 在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄露问题。
- 官方文档
3.2 基本语法
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
测试命令所用代码:
public class ScannerTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(system.in);
String info = scanner.next();
}
}
-
option参数
选项option可以由以下值构成:
-
类装载相关的:
-
垃圾回收相关的:
测试代码:
/** * -xms60m -Xmx60m -XX:SurvivorRatio=8 */ public class GCTest { public static void main(String[] args) { ArrayList<byte[]> list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { byte[] arr = new byte[1024 * 100]; // 100KB list.add(arr); try { Thread.sleep(120); } catch (InterruptedException e) { e.printstacktrace(); } } } }
-
JIT相关的:
-
-
interval参数
-
count参数
-
-t参数
-
-h参数
3.3 补充
jstat还可以用来判断是否出现内存泄漏。
-
第1步:在长时间运行的Java程序中,我们可以运行jstat命令连续获取多行性能数据,并取这几行数据中的OU列(即已占用的老年代内存)的最小值。
-
第2步:然后,我们每隔一段较长的时间重复一次上述操作,来获取多组OU最小值。如果这些值呈现上涨趋势,则说明该Java程序的老年代内存已使用量不断上涨,这意味着无法回收的对象在不断增加,因此有可能存在内存泄露。
4 jinfo
5 jmap
6 jhat
7 jstack
8 jcmd
9 jstatd
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。