Java飞行记录器

参考地址1
参考地址2
最近做性能测试, 无法定位到问题, 故使用内置的Java飞行记录器:Java Mission Control.

一. 开启流程如下:

在Linux服务器上:

1. 要检查的服务的JDK要求:

  • JDK是1.8u44以上. 不需要配置参数;
  • JDK是1.8以下, 需要配置: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

2. 启动服务.

3. 开启飞行记录.

jcmd <pid> JFR.start delay=10s duration=15m filename=log.jfr
说明:

  • pid: 服务的进程号. 使用ps -ef | grep java 查询. (使用时去除尖括号)
  • delay: 延迟开启配置. delay=10s 代表延迟10秒开启.
  • duration: 指收集的日志时长. duration=15m, 代表收集15分钟的JVM信息.
  • filename: 指将收集的日志存在指定的日志文件中. filename=log.jfr, 代表将收集的日志存放在log.jfr中.

二. JFR(Java Flight Recorder)

如何查看飞行记录? 下面展示如何查看飞行记录:

1. 常规选项卡

“常规”选项卡包含一些描述常规应用程序的子选项卡,第一个子选项卡是Overview,它显示了一些基本信息,如堆最大使用率,总CPU使用率和GC暂停时间,如图2-9 所示:

图1-General

另外,查看一段时间内的CPU使用情况,以及应用程序使用情况和机器总数,当应用程序中出现问题时,此选项卡就变得很有用。例如,关注CPU使用率接近100%或CPU使用率过低,过长的垃圾收集暂停时间。

其他子选项卡

  • JVM Information显示JVM信息。启动参数.
  • “ 系统属性”,显示所有系统属性设置.
  • “ 记录”显示有关特定记录的信息,例如:打开的事件。单击问号以获取有关所有选项卡和子选项卡的内置详细信息。

2. 内存选项卡

“内存”选项卡包含有垃圾收集、分配模式和对象统计信息,此选项卡有助于调试内存泄漏及调整GC。图2-10检查飞行记录 - 垃圾收集

图2-Memory

如图2所示,堆使用的尖峰模式完全正常。在大多数应用程序中,始终分配临时对象,满足条件后,将触发垃圾收集(GC)并删除不再使用的对象。因此,堆使用量会稳定增加,直到GC被触发,然后突然下降。

Java中的大多数GC都有一些较小的垃圾收集,old GC遍历整个Java堆,而另一个GC可能会查看堆的一部分,old GC后的堆使用情况,是应用程序正在使用的内存。

启用堆统计信息生成的飞行记录,将以old GC开始和结束。在GCs列表中选择old GC,然后,选择General选项卡,以查看GC原因——堆检查启动GC。这些GC通常比其他GC要稍长一些。为了更好地处理内存泄漏,请查看第一个和最后一个old GC之后的堆。当这个值随时间增加时,可能存在内存泄漏。

“GC时间”选项卡包含有关执行GC所花费的时间,以及应用程序因GC而完全暂停的时间信息。该GC配置选项卡有GC的配置信息。有关这些选项卡的更多详细信息,请单击右上角的问号以查看内置帮助。

分配选项卡: 图3显示了内存分配选项,Java中的小对象在TLAB(线程局部区域缓冲区)中分配。TLAB是一个分配新对象的小内存区域。一旦TLAB满了,线程就会创建一个新的,所有触发新TLAB的分配都被记录下来。在TLAB之外分配较大的对象,这些对象也被记录下来。图3检查飞行记录 - 分配选项卡

图3-Memory

要估计每个类的内存分配,在“新TLAB”选项卡中选择“分配”,然后,选择“分配”选项卡。这些分配是碰巧触发新TLAB的对象分配,char数组引发了最多的新TLABs,分配多少内存作为char数组是未知的,TLAB的大小是对char数组内存分配的估计。

图3是char数组的最大内存分配示例,单击其中一个类,以查看这些分配的堆栈跟踪。示例记录显示,44%的分配压力来自char数组,27%来自Array.copyOfRange,StringBuilder.toString依次调用Throwable.printStackTrace和StackTraceElement.toString,展开进一步以了解这些方法是如何调用的。

注意:应用程序分配的临时对象越多,应用程序必须垃圾回收的越多。“分配”选项卡可帮助找到最多的分配,并降低应用程序中的GC压力。查看TLAB选项卡外的Allocation,以查看大内存分配,这通常比New TLAB选项卡中的分配,具有更少的内存压力。

“对象统计”选项卡

“对象统计”选项卡显示实时收集最多的类。从Memory选项卡中读取Garbage Collection子选项卡以了解实时GC。图3显示了用于飞行记录的堆统计信息。启用飞行记录的堆统计信息以显示数据,底部的“Top Growers”选项卡,显示了在飞行记录期间每种对象的增加情况,特定类型对象的数量增加,通常表示存在内存泄漏,但一个小的变化是正常的,特别是,研究非标准的Java类的top growers。

图4 检查飞行记录 - 对象统计选项卡

代码选项卡

Code选项卡包含有关应用程序,在何处花费大部分时间的信息,在概述子选项卡显示,花费最多执行时间的包和类。这些数据来自抽样,JFR采用间隔运行的线程样本。只对实际运行代码的线程进行抽样,不会显示正在休眠、等待锁或I/O的线程。要了解应用程序时间的更多详细信息,可以查看Hot Methods子选项卡。

图5检查飞行记录 - 代码选项卡

图5显示了采样次数最多的方法,展开这些示例,以查看调用它们的位置。如果一个HashMap.getEntry调用很多,然后展开这个节点,直到找到调用最多的方法。这是用于查找应用程序瓶颈的最佳选项卡。

“Call Tree”子选项卡:显示相同的事件,但从底部开始,例如,来自Thread.run。

Exceptions子选项卡:显示发生的异常,默认情况下,只记录错误,但在启动新记录时更改此设置以包含所有异常。

Compilations子选项卡:显示应用程序运行时实时编译的方法。

Class Loading选项卡:显示已加载的类的数量、实际加载的类和随时间推移的卸载类,此子选项卡仅包含在录制开始时,启用“Class Loading”事件时所显示的信息。

有关这些选项卡的更多详细信息,请单击右上角的问号以查看内置帮助。

线程选项卡

“线程”选项卡包含有关线程,锁争用和其他延迟的信息。

Overview 子选项卡:显示了CPU的使用情况和随着时间推移的线程数量。

Hot Threads子选项卡:显示执行大部分代码的线程,此信息与Code选项卡中的Hot Methods子选项卡使用相同的抽样数据。Contention争用标签对于找到瓶颈非常有用。

图6 检查飞行记录 - 争用选项卡

图6显示了由于同步而最等待的对象。选择一个Class以查看每个对象的等待时间的堆栈跟踪,这些暂停通常由同步方法引起。注意:默认情况下,仅记录长度超过10毫秒的同步事件,但可以在开始录制时设置此阈值。

Latencies 子选项卡:显示其他延迟源,例如,调用sleep或wait、从socket读取或等待文件I/O。

Thread Dumps 子选项卡:显示可以在记录中触发的周期性线程转储。

Lock Instances 子选项卡:显示由于同步而等待最多的对象。

有关这些选项卡的更多详细信息,单击右上角的问号以查看内置帮助。

I/O选项卡

在I/O选项卡中显示了文件读取,文件写入,socket读取,socket写入信息。这个选项卡根据应用程序的不同而有所帮助,特别是I/O操作时间很长时。

注意:认情况下,只显示大于10毫秒的事件,在创建新记录时可以修改阈值。

系统选项卡

“System”选项卡:提供有关运行应用程序的计算机的CPU,内存和操作系统的详细信息。它还显示环境变量,以及与JVM同时运行的其他进程。

事件选项卡

“Events”选项卡:显示录制中的所有事件,这是一个高级选项卡,能够以多种方式使用。有关这些选项卡的更多详细信息,单击右上角的问号以查看内置帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容