- 本次源码已放在Github:https://github.com/nateshao/jvm-tuning
个人博客
https://nateshao.gitee.io
http://www.nateshao.cn
java性能分析常用工具
作为一个java程序员,最基本的要求就是用java语言编写程序,并能够在jvm虚拟机上正常运行,但是在实际开发过程中,我们所有的程序由于各种各样的原因,并不是总能够正常运行,经常会发生故障或者程序的性能低下等问题,此时我们就需要借助于一些jdk提供的工具来定位问题、分析问题并给出合适的解决方案。
打开jdk的bin目录下,见下图:
jdk提供的这些工具都是使用java语言编写的,他们都来自于lib/tools.jar,解压tools.jar,然后找到它下面sun/tools,截图如下,可以很清楚的能够看到这些目录的名称和前面看到的工具的名称一致。
需要注意的是:这里讲解的工具全部基于windows平台下的JDK8版本,如果JDK版本,操心系统不同,工具所支持的功能可能会有较大差别,大部分工具在JDK5中就已经提供了,但是为了避免运行环境带来的差异和兼容性问题,建议使用JDK8来验证我们讲解的内容。
常用jdk工具(命令行)
先简单了解一下常用的jdk工具及它们各自的作用:
jps(JVM Process Status Tool) | 显示指定系统内所有的虚拟机进程 |
---|---|
jstat(JVM Statistics Monitoring Tool) | 用于收集虚拟机各方面的运行数据 |
jinfo(Configuration Info forJava) | 显示虚拟机配置信息 |
jmap(Memory Map for Java) | 生成虚拟机的内存转储快照(heapdump文件) |
jhat(JVM Heap Dump Browser) | 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 |
jstack(Stack Trace forJava) | 显示虚拟机的线程快照 |
可视化工具:
jconsole:是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。
VisualVM:是一个集成多个JDK命令行工具的可视化工具。可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。
jps
作用:列出正在运行的虚拟机进程。并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)
虽然功能比较单一,但它是使用频率最高的JDK命令行工具,因为其他的JDK工具大多需要输入它查询到的唯一ID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,唯一ID与操作系统的进程ID是一致的。使用Windows的任务管理器或者UNIX的ps命令也可以查询到虚拟机进程的唯一ID,但如果同时启动多个虚拟机进程,无法根据进程名称定位时,那只有依赖jps命令 显示主类的功能才能区分了。
命令格式:
jps [options] [hostid]
参数解释:第一个参数:options
-m | 显示进程ID,主类名称,以及传入main方法的参数 |
---|---|
-l | 显示进程ID,主类全名 |
-v | 显示进程ID,主类名称,以及传入JVM的参数 |
-V | 显示进程ID,主类名称 |
-q | 显示进程ID |
[-mlvV] | 可以任意组合使用 |
第二个参数:hostid
主机或者是服务器的ip,如果不指定,就默认为当前的主机或者是服务器。
注意:如果需要查看其他机器上的jvm进程,需要在待查看机器上启动jstatd。
jstat
作用:监视虚拟机各种运行状态信息,可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
命令格式:
jstat [ options vmid [ interval [count] ] ]
参数解释:
第一个参数:options
代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:
-class | 显示有关类加载器行为的统计信息 |
---|---|
-compiler | 显示有关Java HotSpot VM即时编译器行为的统计信息 |
-gc | 显示有关垃圾收集堆行为的统计信息 |
-gccapacity | 显示有关各个垃圾回收代容量及其相应空间的统计信息 |
-gccause | 显示有关垃 |