当前位置:首页>编程日记>正文

深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...

虚拟机系列文章

  • 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析

  • 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析

  • 深入理解 Java 虚拟机-如何利用 VisualVM 对高并发项目进行性能分析

在前面的几篇文章已经讲解了利用一些可视化的工具进行 JVM 性能的监控,但是,在服务器上,我们很多时候是没有办法使用可视化的界面进行这种工作的,这种情景就相当于你需要远程的 linux 系统一样,我们没有其他的办法,只有一种办法就是利用命令行进行操控,而当我们将我们的项目部署到远程的服务器上的时候,我们是没有办法利用可视化的工具对 JVM 进行有效的监控的,这个时候 JDK 的自带的工具就是发挥发的作用的时候了。

以下的这些命令如果放在可视化的工具都是可以被替代的,如果在开发或者测试的过程中,遇到需要监控 JVM 的情况,可以查看这篇文章进行阅读如何利用可视化工具进行 JVM 调优:深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析。

接下来就对每一个常用的命令行工具做一番讲解。

首先,先列出有哪些JDK命令行工具。

名称解释
jps显示指定系统内所有的HotSpot虚拟机的进程
jstat用于收集HotSpot虚拟机各方面的运行数据
jinfo显示虚拟机配置信息
jmap生成虚拟机的内存转存储快照(heapdump文件),利用这个文件就可以分析内存等情况
jhat用于分析上面jmap生成的heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
jstack显示虚拟机的线程快照

1 jps:虚拟机进程状况工具

这个工具使用的频率还是非常高的,因为你需要查看你的程序的运行情况的时候,首先需要知道的就是程序所运行的进程本地虚拟机唯一ID(LVMID),知道这个ID之后,才可以进行其他监控的操作。

  • 命令格式:

1jps [选项] [主机id]
  • jps主要选项:

选项解释
-q只输出LVMID,省略主类名称
-m输出虚拟机进程启动时传递给主类main()函数的参数
-l输出主类的全名
-v输出虚拟机进程启动时的 JVM 参数
  • 实例

1jps -l
2jps -v

2 jinfo:Java配置信息工具

jinfo的功能很简单,主要就是显示和查看调整虚拟机的各种参数。

  • jinfo命令格式:

1jinfo [选项] pid
  • 相关选项

  • 实例

我们在启动程序的时候设置一些JVM参数:-Xms512m -Xmx512m -Xmn128m -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15

我们先使用jps -l查看虚拟机进程ID;

再使用pid为1584进行查询参数;

3 jmap:Java内存映射工具

jmap的主要功能就是生成堆转存储快照,之后,我们再利用这个快照文件进行分析。

  • jmap命令格式:

1jmap [选项] vmid
  • 相关选项

选项解释
-dump生成Java堆转存储快照,格式:-dump:[live,]format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象
-finalizerinfo显示在F-Queue中等待Finalizer线程执行finalize方法的对象,只在linux/Solaris有效
-heap显示Java堆详细信息,如使用哪种回收期、参数配置、分代状况等等。只在Linux/Solaris有效
-histo显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat以ClassLoader为统计口径显示永久代内存状态,只在Linux/Solaris有效
-F当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照,只在Linux/Solaris有效
  • 实例

首先还是查看虚拟机ID;

然后再运行下面命令行;

打开这个dump文件如下;

ok,现在已经有了生成的dump文件,所以,我们就需要对这个文件进行解析,看看jhat命令

4 jhat:虚拟机堆转存储快照分析工具

虽然好像这个命令挺牛逼,但是,其实,由于这个工具的功能不太够,分析也得不到太多的结果,所以我们一般可以会将得到的dump文件用其他的工具进行分析,比如,可视化工具VisualVM等等。

所以,这里简单的做一个例子。

  • 实例

1jhat D:dump.bin

如果有兴趣查看如何利用VisualVM进行查看,可以查看这篇文章:深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析。

5 jstack:Java堆栈跟踪工具

jstack 命令主要用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的:定位线程出现长时间停顿的原因、请求外部资源导致的长时间等待等这些原因。

  • jstack命令格式:

1jstack [选项] vmid
  • 相关选项

选项解释
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用到本地方法的话,可以显示C/C++的堆栈
  • 实例

1jstack -l 6708

6 jstat:虚拟机统计信息监视工具

jstat这个工具还是很有作用的,他可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在服务器上,他是运行期定位虚拟机性能问题的首选工具。

  • jstat命令格式:

1jstat [选项 vmid [interval[s|ms] [count]]]
  • 相关选项

选项解释
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等容量、已用空间、GC时间合计等信息
-gccapacity监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但是会输出额外导致上一次GC产生的原因
-gcnew监视新生代GC状况
-gcnewcapacity监控内容与-gcnew一样,输出主要关注使用到的最大最小空间
-gcold监控老年代GC状况
-gcoldcapacity监控内容与-gcold一样,输出主要关注使用到的最大最小空间
-gcpermcapacity输出永久代使用到的最大最小空间
-compiler输出JIT编译器编译过的方法、耗时等信息
-printcompilation输出已经被JIT编译过的方法
  • 实例

我们这里还关注一下虚拟机GC的状况。

1jstat -gcutil 9676

上面参数的含义:

S0:第一个Survivor区的空间使用(%)大小
S1:第二个Survivor区的空间使用(%)大小
E:Eden区的空间使用(%)大小
O:老年代空间使用(%)大小
M:方法区空间使用(%)大小
CCS:压缩类空间使用(%)大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

了解了这些参数的意义之后,我们就可以对虚拟机GC状况进行分析。我们发现年轻代回收次数12次,使用时间1.672s,老年代回收0次,使用时间0s,所有GC总耗时1.672s。

通过以上参数分析,发现老年代Full GC没有,说明没有大对象进入到老年代,整个老年代的GC情况还是不错的。另外,年轻代回收次数12次,使用时间1.672s,每次用时100ms左右,这个时间稍微长了一点,可以将新生代的空间调低一点,以降低每一次的GC时间。

7 总结

这篇文章主要就讲解了虚拟机命令行工具的使用方法,学会这些命令行工具的使用,可以帮助我们更好的分析虚拟机的运行情况,也可以帮助我们分析问题。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

http://www.coolblog.cn/news/80bea4a37722dd3e.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐