深入理解JVM虚拟机(三):虚拟机性能监控工具
本博客将讲解Java虚拟机性能监控工具的使用以及对Java虚拟机进行性能监控的实验。Java开发人员需要对虚拟机性能监控工具的使用进行掌握,这是很有必要的。
1.概述
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据。工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照文件(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。
2.JDK的命令行工具
JDK的命令行工具大多数是对jdk/lib/tools.jar类库的一层薄包装而已,它们的主要功能代码是在tools类库中实现的。Linux下的这些工具有的甚至是用shell脚本编写的。
SUN JDK监控和故障处理工具:
名称 | 主要作用 |
---|---|
jps | jvm process status tool,显示指定系统内所有的hotspot虚拟机进程 |
jstat | jvm statistics monitoring tool,用于收集hotspot虚拟机各方面的运行数据 |
jinfo | configuration info for java,显示虚拟机配置信息 |
jmap | memory map for java,生成虚拟机的内存转储快照(heapdump文件) |
jhat | jvm heap dump browser,用于分析heapmap文件,它会建立一个http/html服务器让用户可以在浏览器上查看分析结果 |
jstack | stack trace for java ,显示虚拟机的线程快照 |
2.1 jps:虚拟机进程状况工具
以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。
jps命令格式 jps [options] [hostid]
jps可以通过RMI协议开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
jps常用的选项
属性 | 作用 |
---|---|
-p | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是jar包,输出jar路径 |
-v | 输出虚拟机进程启动时jvm参数 |
输入命令 jps
2.2 jstat:虚拟机统计信息监视工具
jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据,在没有GUI图形界面,只是提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jstat的命令格式:jstat [option vmid [interval [s|ms] [count]] ]
对于命令格式中的VMID和LVMID,如过是本地虚拟机进程,VMID和LVMID是一致的,如果是远程虚拟机,那VMID的格式应当是:[protocol:] [//] lvmid[@hostname[:port]/servername].
参数interval 和count分别表示查询的间隔和次数,如果省略这两个参数,说明只查询一次。
属性 | 作用 |
---|---|
-class | 监视装载类、卸载类、总空间以及类装载所耗费的时间 |
-gc | 监视java堆状况,包括eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计信息 |
-gccapacity | 输出主类的全名,如果进程执行的是jar包,输出jar路径 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到最大、最小空间 |
-gccause | 监视内容与-gc基本相同,但输出主要关注已使用控件占总空间的百分比 |
-gcnew | 与-gcutil功能一样,但是会额外输出导致上一次gc产生的原因 |
-gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC情况 |
-gcoldcapacity | 监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-compiler | 输出JIT编译过的方法、耗时等信息 |
-printcompilation | 输出已经被JIT编译过的方法 |
监视进程虚拟机ID39312 的java堆情况
输入命令 jstat -gc 39312
2.3 jinfo Java配置信息工具
jinfo的作用是实时地查看和调整虚拟机各项参数。
jinfo的命名格式:
jinfo [ option ] pid
输入命令 jinfo 39312
2.4 jmap:java内存映像工具
jmap命令用于生成堆转储快照。jmap的作用并不仅仅为了获取dump文件,它还可以查询finalize执行队列、java堆和永久代的详细信息。如空间使用率、当前用的是哪种收集器等。
和jinfo命令一样,jmap在windows下也受到比较大的限制。除了生成dump文件的-dump选项和用于查看每个类的实例、控件占用统计的-histo选项在所有操作系用都提供之外,其余选项只能在linux/solaris下使用。
jmap格式 jmap [option] vmid
选项 | 作用 |
---|---|
-dump | 生成java堆转储快照。格式为: -dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象 |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效 |
-heap | 显示java堆详细信息,如使用哪种收集器、参数配置、分代情况等,在Linux/Solaris平台下有效 |
-jisto | 显示堆中对象统计信息,包含类、实例对象、合集容量 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效 |
-F | 当虚拟机进程对-dump选项没有相应时。可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效 |
生成java堆转储快照 Monitor.bin
输入命令 jmap -dump:format=b,file=Monitor.bin 39312
2.5 jhat:虚拟机堆转储快照分析工具
Sun JDK提供jhat与jmap搭配使用,来分析dump生成的堆快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。
用法举例: jhat test1.bin
test1.bin为生成的dump文件。
屏幕显示“Server is ready.”的提示后,用户在浏览器中键入http://localhost:7000就可以看到分析的结果了。
分析结果默认是以包围单位进行分组显示,分析内存泄漏问题主要会使用到其中的“Heap Histogram”与OQL标签的功能。前者可以找到内存中总容量最大的对象。后者是标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计。
分析java堆转储快照Monitor.bin
输入命令 jhat Monitor.bin
2.6 jstack:java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致长时间等待等。
jstack 格式 jstack [option] vmid
option选项的合法值和具体含义
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示c/c++的堆栈 |
Tread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有的线程的StackTraceElement对象。
输入命令 jstack 39312
2.7 HSDIS:JIT生成代码反汇编
Java虚拟机规范中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的内容产生了越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。基于这个原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。
3. JDK的可视化工具
JDK中除了提供大量的命令行工具外,还有两个功能强大的可视化工具:JConsole和VisualVM。
3.1 JConsole
JConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。
3.2 VisualVM:多合一故障处理工具
VisualVM是一个集成多个JDK命令行工具的可视化工具。VisualVM基于NetBeans平台开发,它具备了插件扩展功能的特性,通过插件的扩展,可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等。VisualVM在JDK/bin目录下。
VisualVM的性能分析功能甚至比起JProfiler、YourKit等专业且收费的Profiling工具都不会逊色多少,而且VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。这个优点是JProfiler、YourKit等工具无法与之媲美的。
深入理解JVM虚拟机(三):虚拟机性能监控工具相关推荐
- Java虚拟机常用的性能监控工具
基础故障处理工具 jps: 虚拟机进程状况工具 功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID. 它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到 ...
- 【深入理解JVM 六】虚拟机字节码执行系统
前边几篇Blog分别介绍了JVM的类加载机制.运行时数据区域,那么字节码文件已然被加载到了JVM的内存中来,接下来就是执行它了.虚拟机字节码执行引擎的位置如下图所示,除了本地方法栈,其他运行时数据区域 ...
- 《深入理解JVM 第三版》 读书笔记
2 Java内存区域与内存溢出异常 2.2 运行时数据区域 2.2.1程序计数器 程序计数器占用空间较小,可以看作当前 线程执行字节码的行号.因此是线程独立的. 如果执行的是native方法,则该计数 ...
- 深入理解JVM(三)Java 类加载机制
文章目录 1 什么是类加载机制 2 类的生命周期 2.1 加载 2.2 验证 2.3 准备 2.4 解析 2.5 初始化 2.5.1 < clinit >()方法详解 2.5.2 类在什么 ...
- 深入理解JVM——(三)为什么JVM新生代需要两个Survivor区
经过了JVM区域的学习,我们知道在堆中新生代具有一个Eden区和两个Survivor区,这里就有疑问了,为什么需要Survivor区和为什么需要两个Survivor区?带着疑问我们思考一下. 一.为什 ...
- 深入理解JVM(三)——配置参数
2019独角兽企业重金招聘Python工程师标准>>> JVM配置参数分为三类参数: 1.跟踪参数 2.堆分配参数 3.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以 ...
- 深入理解JVM(三)—— HelloWorld字节码完整解析
目录 1.字节码由来 2.hello代码字节码结构和使用javap -v指令查看字节码结构 2.1 hello代码字节码结构 2.2 javap -v指令查看字节码结构 3.字节码完整解析 3.1 魔 ...
- 深入理解Jvm(一)--内存理解
一.Java内存区域理解 Java与C++之间有一堵由内存动态分配(加载)和垃圾收集技术所围成的高墙,墙外面的1人想进去,墙内边的人想出去. 1.Jvm内存: Jvm在执行java程序的过程中会把Jv ...
- java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践
本文转自: https://juejin.im/post/59e6c1f26fb9a0451c397a8c 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...
最新文章
- cordova 安装ssl证书_cordova环境配置(android)
- 16行代码AC——紫书| 例题7-3 Fractions Again?! (UVA - 10976)_时间复杂度O(n)
- 一段echats 饼状图刷新代码
- Linux: I/O多路转接之poll(有图有代码有真相!!!)
- python模块导入_python模块导入
- python生成簇_不调包用PYTHON写GMM(高斯混合模型)算法
- python邮件发送_Python实现邮件发送
- Tomcat Connector的三种运行模式【bio、nio、apr】
- 北京思源培训中心---C#下用P2P技术实现点对点聊天(2)
- 【Beam Search】seq2seq中的beam search算法过程
- prometheus监控mysql指标_使用Prometheus监控MySQL状态
- TransE 论文笔记
- 如何切换水经注地图下载器中的小数度和度分秒显示
- 对我启发最大的数学学习方法(转自知乎)
- JAVA进制转换,十进制转换为八进制
- 一文读懂社交网络分析(附应用、前沿、学习资源)
- Phil Coulson
- aws篇1 aws-cli的使用
- KEYCODE 按键列表
- OPC:服务器开发(一)如何开发OPC Server
热门文章
- Oracle(21)—— Linux环境部署Oracle11g数据库
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
- 【使用 DOM】为DOM元素设置样式
- 关于工资的三个秘密【转载】
- **23.m阶的B-树和B+树的主要区别
- 谷歌体三维捕捉新突破:实现后期任意照明修改
- 天才少年何恺明:高考状元的开挂人生
- 蒙特卡罗(Monte Carlo)方法
- 高校计算机实验管理人员会议,计算机科学学院召开实验室安全与管理工作会议...
- 西南石油大学计算机二级成绩查询,西南石油大学本科学生成绩自助查询打印终端管理办法...