JavaGuide知识点整理——JDK监控和故障处理工具总结

JDK命令行工具

这些命令在JDK安装目录的bin目录下:

  • jsp:类似UNIX的ps命令,用于查看所有java进程的启动类。传入参数和java虚拟机参数等信息。
  • jstat:用于收集HotSpot虚拟机各方面的运行数据。
  • jinfo:Configuration Info for Java,显示虚拟机配置信息。
  • jmap:生成堆转储快照。
  • jhat:用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果。
  • jstack:生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。
jps:查看所有java进程

jps(JVM Process Status)命令类似UNIX的ps命令、
jps:显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。
jps -q:只输出进程的本地虚拟机唯一ID.
jps -l:输出主类的全名,如果进程执行的是jar包,输出jar路径。
jps -v:输出虚拟机进程启动时JVM参数。
jps -m:输出传递给java进程main()函数的参数

jstat:监视虚拟机各种运行状态信息

jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程(需要远程主机提供RMI支持)虚拟机进程中的类信息,内存,垃圾收集,JIT编译等运行数据。在没有GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。

jstat命令使用格式:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

比如如下命令:jstat -gc -h3 17188 1000 10
表示分析进程id为 17188的gc情况,每1000ms打印一次记录,打印10次停止。每三行打印指标头部。
效果如下:

jstat使用示例

当然了实例中的-gc也可以换成别的,常见的option如下:

  • jstat -class vmid:显示ClassLoader的相关信息
  • jstat -compiler vmid:显示JIT编译相关的信息
  • jstat -gc vmid:显示与GC相关的堆信息
  • jstat -gccapacity vmid:显示各个代的容量以及使用信息
  • jstat -gcnew vmid:显示新生代信息
  • jstat -gcnewcapacity vmid:显示新生代大小和使用情况
  • jstat -gcold vmid:显示老年代和永久代行为统计。不过1.8开始因为永久代被移除了,所以只显示老年代的行为统计了。
  • jstat -gcoldcapacity vmid:显示老年代大小
  • jstat -gcpermcapacity vmid:显示永久代大小。jdk1.8被移除了。
  • jstat -gcutil vmid:显示垃圾收集信息

    option使用demo

上述命令加上-t 参数可以在输出信息上看到Timestamp列,显示程序运行时间。

jinfo:实时查看和调整虚拟机各项参数

jinfo vmid : 输出当前jvm进程的全部参数和系统属性(第一部分是系统的属性,第二把部分是jvm的参数)。

jinfo -flag name vmid:输出对应名称的参数的具体值。比如输出MaxHeapSize,查看这个当前jvm进程是否开始打印GC日志等。

jinfo使用demo

使用jinfo可以在不重启虚拟机的情况下,动态修改jvm参数。尤其是线上的环境特别有用。
使用jinfo -flag +/- name vmid 可以开启或者关闭对应名称的参数。之前我们看到是开启了gc打印的,现在关闭一下:

修改jvm配置参数

jmap:生成堆转储快照

jmap命令用于生成堆转储快照。如果不使用jmap命令,想要获取java堆转储,可以使用“-XX:+HeapDumpOnOutOfMemoryError” 参数。可以让虚拟机在OOM异常出现之后自动生成dump文件,linux命令下可以通过kill -3发送进程退出信号也能拿到dump文件。

jmap的作用不仅仅是为了获取dump文件,他还可以查询finalizer执行队列,java堆和永久代的详细信息,如空间使用率,当前使用的是哪种收集器等。和jinfo一样,jmap有不少功能在windows平台下也是受限制的。

jhat:分析heapdump文件

jhat用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果。

jstack:生成虚拟机当前时刻的线程快照

jstack命令用于生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合。
生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等。都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈。就可以知道没有响应的线程到底在后台做了些什么事,或者在等待什么资源。
下面是死锁的demo:

public class Test {

    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args){
            new Thread(() -> {
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread() + "waiting get resource2");
                    synchronized (resource2) {
                        System.out.println(Thread.currentThread() + "get resource2");
                    }
                }
            }, "线程 1").start();

            new Thread(() -> {
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread() + "waiting get resource1");
                    synchronized (resource1) {
                        System.out.println(Thread.currentThread() + "get resource1");
                    }
                }
            }, "线程 2").start();
        }

    
}

我们启动这个main方法后去控制台查看(先用jps查看了死锁的这个线程是18532):

jstack 18532

因为这个结果比较长,所以截图截了最关键的部分。可以看到jstack已经帮我们定位到了死锁。

JDK可视化分析工具

JConsole:java监视与管理控制台

JConsole是基于jmx的可视化监视,管理工具。可以很方便的监视本地以及远程服务器的java进程的内存使用情况。你可以在控制台输出console命令启动或者在JDK目录的bin目录找到jconsole.exe双击启动。

启动jconsole

选择一个线程链接后就可以看到可视化页面:

java程序概况

内存监控

JConsole可以显示当前内存的详细信息。不仅包括堆内存/非堆内存的整体信息。还可以细化到Eden区,Survivor区等的使用情况,如下图所示:

image.png

点击右边的执行GC 按钮可以强制应用程序执行一个full GC。

线程监控

类似我们前面讲的jstack命令,不过这个是可视化的。
最下面有一个检测死锁的按钮,点击这个按钮可以自动为你找到发生死锁的线程和详细信息。

找到了死锁

Visual VM:多合一故障处理工具

VisualVM 提供在java虚拟机上运行的java应用程序的详细信息。在VisualVM的图形用户界面中,可以方便,快捷的查看多个java应用程序的相关信息。
Visual VM 官网:https://visualvm.github.io/ 。Visual VM 中文文档:https://visualvm.github.io/documentation.html

VisualVM是到目前为止随着JDK发布的功能最强大的运行监视和故障处理程序。官方在VisualVM的软件说明上写了all in one的描述。预示着他除了运行监视,故障处理外,还提供了很多其他方面的功能,如性能分析。VisualVM的性能分析功能甚至比起JProfiler,YourKit等专业且收费的工具都不会逊色。而且VisualVM还有一个很大的优点:不需要被监视的程序特殊 运行,因此他对于应用程序的实际性能的影响很小。使得他可以直接应用在生产环境中。这个优点是JProfiler,YourKit等工具无法媲美的。

VisualVM基于NetBeans平台开发,因此一开始就具备了插件扩展功能的特性。通过插件扩展支持,VisualVM可以做到:

  • 显示虚拟机进程以及进程的配置,环境信息(jps,jinfo)
  • 监视应用程序的CPU,GC,堆,方法区以及线程的信息(jstat,jstack)
  • dump以及分析堆转储快照(jmap,jhat)
  • 方法级的程序运行性能分析,找到被调用最多,运行时间最长的方法。
  • 离线程序快照:收集程序的运行时配置,线程dump,内存dump等信息建立一个快照,可以将快照发送开发者处进行bug反馈。
  • 其他plugins的无限的可能性

这里就不介绍VisualVM了,想了解的自己去看官网。



作者:唯有努力不欺人丶
链接:https://www.jianshu.com/p/84f90e960659
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值