Java问题诊断和排查工具

一、前言

在数字世界中,Java作为一种流行的编程语言,广泛应用于开发各种类型的应用程序。然而,在开发过程中,不可避免地会出现各种问题。本文将探讨一些用于诊断和排查Java问题的工具。

二、Java问题诊断和排查工具

1、JDK自带工具

在JDK的bin目录下有很多命令行工具:在这里插入图片描述
可以看到各个工具的大小基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是 jdk\lib\tools.jar 类库的一层薄包装而已,他们的主要功能代码是在tools类库中实现的。

命令行工具的好处是:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程telnet到服务器上都会受到限制。而借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。

2、常用命令

在这里插入图片描述
1、jps:查看本机java进程信息

2、jstack:打印线程的栈信息,制作 线程dump文件

3、jmap:打印内存映射信息,制作 堆dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具,用于解析堆dump文件并以适合人阅读的方式展示出来

6、jconsole:简易的JVM可视化工具

7、jvisualvm:功能更强大的JVM可视化工具

8、javap:查看字节码

3、JAVA Dump:

JAVA Dump就是虚拟机运行时的快照,将虚拟机运行时的状态和信息保存到文件中,包括:

线程dump:包含所有线程的运行状态,纯文本格式

堆dump:包含所有堆对象的状态,二进制格式

3.1、jps

显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其他用户的还只能用linux的ps命令。
在这里插入图片描述

执行jps命令,会列出所有正在运行的java进程,其中jps命令也是一个java程序。前面的数字就是进程的id,这个id的作用非常大,后面会有相关介绍。

jps -help:
在这里插入图片描述
jps -l 输出应用程序main.class的完整package名或者应用程序jar文件完整路径名

在这里插入图片描述

jps -v 输出传递给JVM的参数

在这里插入图片描述

jps失效

我们在定位问题过程会遇到这样一种情况,用jps查看不到进程id,用ps -ef | grep java却能看到启动的java进程。

要解释这种现象,先来了解下jps的实现机制:

java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。

我们来思考下:如果由于磁盘满了,无法创建这些文件,或者用户对这些文件没有读的权限。又或者因为某种原因这些文件或者目录被清除,出现以上这些情况,就会导致jps命令失效。

如果jps命令失效,而我们又要获取pid,还可以使用以下两种方法:

1、top | grep java
2、ps -ef |grep java

3.2、jstack

主要用于生成指定进程当前时刻的线程快照,线程快照是当前java虚拟机每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待。
在这里插入图片描述

3.3、jmap

主要用于打印指定java进程的共享对象内存映射或堆内存细节。

堆Dump是反映堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。一般在内存不足,GC异常等情况下,我们会去怀疑内存泄漏,这个时候就会去打印堆Dump。

3.3.1、jmap -heap pid:查看堆使用情况

在这里插入图片描述

3.3.2、jmap -histo pid:查看堆中对象数量和大小

在这里插入图片描述
打印的信息分别是:序列号、对象的数量、这些对象的内存占用大小、这些对象所属的类的全限定名

如果是内部类,类名的开头会加上*,如果加上live子参数的话,如jmap -histo:live pid,这个命名会触发一次FUll GC,只统计存活对象

3.3.3、jmap -dump:format=b,file=heapdump pid:将内存使用的详细情况输出到文件

然后使用jhat命令查看该文件:jhat -port 4000 文件名 ,在浏览器中访问http:localhost:4000/

3.4、jstat

jstat是一个用于监控Java虚拟机(JVM)性能的命令行工具。它可以提供关于Java应用程序的垃圾收集(GC)、编译任务和其他运行时统计信息。jstat工具是基于命令行的,可以用来生成和显示JVM的性能统计信息。

jstat工具的使用方法如下:

  1. 打开命令行终端。
  2. 输入以下命令格式:
jstat -<option> [<interval> [<count>]] <vmid>

其中,<option>是指你想要查看的统计信息,比如编译任务的数量可以使用-compiler,垃圾收集可以使用-gc等。<interval><count>是用于连续地重复地收集数据的,比如你可以设置每500毫秒收集一次数据,共收集10次。<vmid>是虚拟机标识符,它是一个整数值,可以通过jps命令查看到。

例如,如果我们想要查看编号为1234的Java应用程序的垃圾收集统计信息,可以输入以下命令:

jstat -gc 1234

运行结果将会显示关于垃圾收集的各种统计信息,包括新生代、老年代的使用情况,垃圾回收的次数和时间等。

jstat是一个非常实用的工具,它可以帮助我们诊断和解决Java应用程序的性能问题。通过使用jstat,我们可以更好地了解JVM的运行情况,从而优化应用程序的性能。

三、总结

该命令适用的场景是程序内存不足或者GC频繁,这时候很可能是内存泄漏。通过用以上命令查看堆使用情况、大量对象被持续引用等情况。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

猜你喜欢

转载自blog.csdn.net/wmj20001225/article/details/132669905