原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。
今天我们要开的车是,江铃汽车。全称Jiangling Motors Corporation,简称JMC。
一车在手,吃喝不愁。车作为男人的第二个老婆,拥有一辆JMC是所有成功男人的梦想。打开小小的车窗,任嘶吼的狂风揉捏自己的面庞,是一种让人无比享受的存在。
列车驶向何处,前方又是何方,全在掌舵者一念之间。程序员掌舵,当然与众不同。我们今天的列车,就是jmc监控工具。
呸,撞车了。
与JMC撞车的,也是jmc,全称Java Mission Control,是故障排查的一大利器。
在世风日下的今天,强行扭正jmc的坐姿,也算是一股清流。它和jvisualvm一样,都被jdk给抛弃了,因为长得太胖,现在需要单独下载。
先看它的图标。
再看它的界面。你可以看到,它是一个图形化的工具,生产环境中使用必然受到限制,你需要首先开通JMX才可以使用。但我习惯在压测的时候才用它。
因为它有一个Flight Recorder功能。
为什么里面这么多按钮,我仅仅提到Flight Recorder这个东西呢?因为其他东西都是点吧点吧就可以理解的,xjjdog要是再介绍一下的话,就像是智障一样。
但是Flight Recorder必须要详细描述下,因为智商不到80不好理解它。
Flight Recorder源自飞机的黑盒子,一看就是用来录制信息,然后事后分析的。在Java11中,它可以通过jcmd命令进行录制了。
主要有5个命令:configure、check、start、dump、stop。执行顺序的话,先start再dump,最后stop。例如:
jcmd <pid> JFR.start jcmd <pid> JFR.dump filename=recording.jfr jcmd <pid> JFR.stop 复制代码
先来看下它的好处:
在保证低开销的基础上,JFR 提供的能力也令人眼前一亮。
例如:我们无需 BCI 就可以进行 Object Allocation Profiling,终于不用担心 BTrace 之类把进程搞挂了。
对锁竞争、阻塞、延迟,JVM GC、SafePoint 等领域,进行非常细粒度分析。甚至深入 JIT Compiler 内部,全面把握热点方法、内联、逆优化等等。
JFR 提供了标准的 Java、C++ 等扩展 API,可以与各种层面的应用进行定制、集成,为复杂的企业应用栈或者复杂的分布式应用,提供 All-in-One 解决方案。而这一切都是内建在 JDK 和 JVM 内部的,并不需要额外的依赖,开箱即用。
录制谁好呢?还是录制一个tomcat吧。下图是录制了一分钟之后的结果,可以看到左边那一串长长的结果列表。
通过这些数据,可以清楚的了解到这一分钟时间内,整个操作系统以及JVM的所有数据情况。这花花绿绿的颜色,一看就知道是很厉害的样子。
点击C2编译器线程,可以看到详细的热点类,以及方法内联后的代码大小。线程的Wait、Idea、Block等各种状态和时序,都能在这里看到。C2此时在疯狂运转。
可以看到种类型的数据,每个时刻所申请的内存大小。这在排查一些内存泄漏问题的时候,不是一般的有用。
锁实例可以看到期间出现的所有Lock实例,以及它的使用信息。
当然,对文件和Socket的操作也淋漓尽致,一目了然。包括什么时候读了多少数据,从哪里读写的,都可以从栈信息里看到。
方法调用信息和排行。
对垃圾回收的信息监控也是比较详细的。比如什么时候发生了垃圾回收,用的什么垃圾回收器,耗时,甚至是发生的时机等,都可以在这里看到。
编译这里,显示了更加详细的JIT相关信息,包括生成后的CodeCache大小。
神奇的是,它连TLAB区域的申请信息都给录制了,不得不说是一个神器。
TLAB的全称是Thread Local Allocation Buffer,JVM默认给每个线程开辟一个buffer区域,用来加速对象分配。这个buffer,就放在Eden区。
这个道理和Java语言中的ThreadLocal类似,避免了对公共区的操作,以及一些锁竞争。
JFR,全称Java Flight Recorder,我们今天对它的介绍,就结束了。
车已经到站了,请下车的乘客做好准备,祝您旅途愉快。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。