前言:
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想
进去,墙里面的人却想出来。
4.1、概述
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处
理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照
(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。经常使用适当的虚拟
机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。
------工具永远都是知识技能的一层包装
4.2、JDK的命令行
JDK的bin目录中有“java.exe”、“javac.exe”这两个命令行工具
每逢JDK更新版本之时,bin目录下命令行工具的数量和功能总会不知不觉地增加和增强
如图所示:展示一部分
这些工具的程序提及非常小
这些命令行工具大多数jdk/lib/tools.jar类库的一层包装而已
主要的功能实现代码是在tools类库中实现的
若是使用Linux的JDK,可以发现这些工具中就是Shell直接写成的
可以使用vim打开
当应用程序部署到生产环境后
无论是直接接触物理服务器还是远程Telent到服务器都可能收到限制
借助tools.jar类库中的接口
可以直接在应用程序中实现强大的监控分析功能
JDK主要命令行以及监控工具的用途:
4.2.1、jsp:虚拟机进程工具
JDK的很多小工具都参考了UNIX命令的命名方式
jps(JVM Process StatusTool)是其中的典型
出列名字项UNIX的ps命令方式之外
它的功能也和ps命令类似:
可以列出正在运行的虚拟进程
并显示虚拟机执行主类(Main、Class、main()函数所在类)名称
以及这些进程在本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)
虽然功能比较单一
但是是使用频率最高的JDK命令工具
因为其他的JDK工具大多需要输入它查询到的LVMID来确定需要监控的哪一个虚拟机
对于本地虚拟机来说
LVMID与操作系统进程ID是一致的
使用Windows的任务管理器或者UNIX的ps命令也可以查询到虚拟机进程的LVMID
但是吐过同时启动了多个虚拟机进程
无法根据进程名进行定位时,此时只能依赖jps命令来显示
jps命令格式:
jps [options][hostid]
jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态
hostid:为RMI注册表中的注册主机名
其他选项:
执行效果:
test1是正在运行的main函数
4.2.2、jstat:虚拟机统计信息监控工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机中各种运行状态信息的命令工具
在没有GUI图形界面,只提供了纯文本的控制台环境的服务器上
将是运行期定位虚拟机性能问题的首选工具
命令格式:
jstat[option vmid[interval[s|ms][count]]]
对于命令格式中的VMID与LVMID需要特别说明一下:
如果是本地的虚拟进程,VMID与LVMID是一致的
如果是远程虚拟进程,那么VMID的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设
需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:
jstat-gc 2764 250 20
选项option代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行
期编译状况: