您的位置:首页 > 运维架构

素小暖讲JVM:第四章 虚拟机性能监控与故障处理工具总结,第五章 调优案例分析与实战

2019-12-25 18:11 1586 查看

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

本系列是用来记录《深入理解Java虚拟机》这本书的读书笔记。方便自己查看,也方便大家查阅。

欲速则不达,欲达则欲速!

第四章 虚拟机性能监控与故障处理工具总结

一、JDK的命令行工具

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

可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main所在类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier LVMID)

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

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供纯文本控制台环境的服务器上,它将时运行期定位虚拟机性能问题的首选工具。

3、jinfo:java配置信息工具

jinfo(Configuration Info for java)的作用是实时地查看和调整虚拟机各项参数

4、jmap:java内存映象工具

jmap(Merory Map for java)命令用于生成堆转储快照(一般称为heapdump或dump文件)

5、jhat:虚拟机堆转储快照分析工具

Sun JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,分析jmap生成的堆转储快照jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。

6、jstack:java堆栈跟踪工具

jstack(Stack Trace for java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者Javacore文件),线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因,线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做了些什么事情,或者等待着什么资源。

在JDK1.5中java.lang.Thread类新增了一个getAllStackTreces()方法,用于获取虚拟机中所有线程的StackTraceElement对象,使用这个方法可以通过简单的几行代码就完成jstack的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。

<%@ page import="java.util.Map"%>

<html>
<head>
<title>服务器线程信息</title>
</head>
<body>
<pre>
<%
for (Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()) {
Thread thread = (Thread) stackTrace.getKey();
StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue();
if (thread.equals(Thread.currentThread())) {
continue;
}
out.print("\n线程:" + thread.getName() + "\n");
for (StackTraceElement element : stack) {
out.print("\t"+element+"\n");
}
}
%>
</pre>
</body>
</html>

7、HSIDS:JIT生成代码反汇编

HSIDS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件

二、JDK的可视化工具

1、JConsole:java监视与管理控制台

JConsole(java monitoring and management console)是一种基于JMX的可视化监视管理工具,它管理部分的功能是针对JMX MBean进行管理,MBean可以使用代码,中间件服务器的管理控制台或者符合JMX规范的软件进行访问。

2、VisualVM:多合一故障处理工具

VisualVM(All-in-One java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具,官方在VisualVM的软件说明上写上了“All-in-One”的描述字样,预示着它除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析,VisualVM的性能分析功能甚至比起JProfiler YourKit等专业且收费的Profiling工具都不会逊色多少,并且VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中,这个优点是JProfiler YourKit等工具无法与之媲美的。

第五章 调优案例分析与实战

在《深入理解java虚拟机》书中本节的主要内容是讲作者在工作过程中对调优的一些经验实战。对于我们读者来说,重点是学习作者分析解决问题的具体思路。当然不能离开书本的内容,作者利用的是上一节所介绍到的工具去解决他所遇到的问题。但本人的工作环境跟书本上的教程不一致,但思路大同小异。所以在本章的学习笔记当中,还是结合自身的情况,聊聊调优这事吧。

一、工作环境简介

在上一节学习已经提过,由于本人的工作环境关系,使用的大都是IBM产品,包括服务器、中间件等,其中Java虚拟机就是IBM的J9虚拟机。它跟HotSpot多少还有点不同,由于IBM的资料甚少,所以对JVM调优也是一个难点。到目前为止,我们只能通过WAS控制台对JVM参数进行不断的修改尝试对比,找出比较优的方案。而IBM的产品都是一套完整的解决方案,WAS同时提供了对应用的参数跳转、对虚拟机的运行监控等都集成在一个控件台里面,如下如所示:

调整JVM参数的页面如下:

性能监控主页如下:

性能监控有许多项目可以自行选择,例如JDBC连接池、JVM运行情况、WEB容器线程池等,其中WEB容器与JVM运行情况监控如下图所示:

通过上图的曲线图看观察JVM堆内存使用走向,通过曲线也大概可以看出GC的情况。

二、一次调优经历

最难忘的一次调优就是2014年巴西世界杯,7天7夜下来最悲剧的莫过于你们在看世界杯,而我们却在日夜维护系统的世界杯活动。隐约记得参与活动人数大概上百万左右,系统经常性罢工,所以只好临时日夜不停地边维护边修复调优。问题大概是到了某个并发瓶颈,系统就会慢下来,甚至阻塞。由于是生产环境的线上活动,客户要求不能停止活动,哪怕阻塞了,也要求通过重启暂时恢复。所以我们的排查工作更难了,为了重现现象,我们需要等待瓶颈出现的那点时间日夜蹲守排查。通过对服务器指标的观察,都不是瓶颈所在。最后通过Kill -3间隔输出多个javacore文件进行线下分析,才找出问题所在。而这个javacore文件我们是通过“IBM Thread and Monitor Dump Analyzer for Java”这个软件进行分析的,如下如所示:

这个可视化工具可以非常详细的查询到JVM的各项信息,如JVM启动参数,GC信息,线程占等,Sun JDK的命令行工具功能这几乎都涵盖了。有点类似VisualVM,不过VisualVM是动态监控的。下图为线程详细查询图:

当然,现在回想起两年前的那次调优经历,已经没有太多忧伤了,更多地已经成为了我工作经历上的“里程碑”了。偶尔蓦然回首,还是有点滋味。

三、总结

调优确实是一个“苦力”活,但对人员素质要求比较高,好像上述所说的经历,就是因为经验不足带导致这么长的调优时间。当然,阳光总在风雨后,熬过去了,确实进步不少,写代码的大局观也提升不少。所以调优这事,是面试的一大好题,最能反映个人能力。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: