1. 前言
不会程序调优的程序员不是一个好程序员。
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。
2. JDK的命令行工具
我们熟知的JDK的bin目录中有“java”、“javac”命令。
除此之外,还有一些工具,对于我们坚实虚拟机和故障处理非常有用,如下表:
2.1 javap:分析java汇编指令
通过javap命令可以查看一个java类反汇编、常量池、变量表、指令代码行号表等等信息。
一般常用的是-v -l -c三个选项。
javap -v classxx
,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
javap -l
会输出行号和本地变量表信息。
javap -c
会对当前class字节码进行反编译生成汇编代码。
2.2 jps:虚拟机进程状况工具
常用:
jps -l
jps -l -v
命令格式:jps [options] [hostid]
Option参数:
-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数
2.3 jstat:虚拟机统计信息监视工具
是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
常用命令:jstat -gc 1262
、jstat -class 11589
、jstat -compiler 1262
、jstat -gccapacity 1262
2.4 jinfo:Java配置信息工具
实时查看和调整虚拟机运行参数。
之前的jps -v
只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令。
命令:jinfo 3796
2.5 jmap:Java内存映像工具
命令用于生成堆转储快照(一般称为heapdump 或者dump文件),如果不使用这个命令,还可以使用
-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。
jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。
常用:jmap -dump:format=b,file=eclipse.bin 3500
2.6 jhat:虚拟机堆转储快照分析工具
jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。
常用:jhat eclipse.bin
2.7 jstack:Java堆栈跟踪工具
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
常用命令:jstack -l 3500
2.8 HSDIS:JIT生成代码反汇编
一般分析程序如何执行,通过软件调试工具(GDB、Windbg等)来断点调试是最常见的手段,但是这样的调试方式在Java虚拟机中会遇到很大的困难,因为大量执行代码是通过JIT编译器动态生成到CodeBuffer中的,没有很简单的手段来处理这种混合模式的调试。
基于这种背景,就有了HSDIS插件