使用 VisualVM 进行性能分析及调优

概述

垦荒除夜型 Java 运用轨范的进程傍边难免碰着内存泄露、功效瓶颈等成就,好比文件、汇集、数据库的衔接未释放,未优化的算法等。跟着运用轨范的延续运转,可以会组成悉数零 星运转效率下落,严重的则会组成零星溃逃。为了找出轨范中潜藏的这些成就,在项目垦荒后期经常会行使功效剖析对象来对运用轨范的功效中止剖析和优化。

VisualVM 是一款免费的功效剖析对象。它经由进程 jvmstat、JMX、SA(Serviceability Agent)和 Attach API 等多种体式格式从轨范运转时获得实时数据,从而进举动态的功效剖析。同时,它能自动选择更快更轻量级的手艺尽量增加功效剖析对运用轨范酿成的影响,提高功 效剖析的精度。

本文将对 VisualVM 的次要功用一一引见并商酌若何行使获得的数据中止功效剖析及调优。


配景常识

功效剖析的次要体式格式

  • 扼守:扼守是一种用来检查运用轨范运转时举动的通俗方法。常日会有多个视图(View)分离实时地显示 CPU 行使情形、内存行使情形、线程形态和其他一些有用的信息,以便用户能很快地发明成就的症结所在。
  • 转储:功效剖析对象从内存中取适合前形态数据并存储到文件用于静态的功效剖析。Java 轨范是经由进程在启动 Java 轨范时添加适合的前提参数来触发转储操作的。它包括以下三种:
    • 零星转储:JVM 生成的外埠零星的转储,又称作焦点转储。通俗的,零星转储数据量除夜,需求平台相关的对象去剖析,如 Windows 上的 windbg 和 Linux 上的 gdb。
    • Java 转储:JVM 内部生成的花招化后的数据,包括线程信息,类的加载信息和堆的统计数据。常日也用于检测逝世锁。
    • 堆转储:JVM 将一切对象的堆内容存储到文件。
  • 快照:运用轨范启动后,功效剖析对象最先汇集各类运转时数据,个中一些数据直接显示在扼守视图中,而其他除夜部份数据被留存在内部,直到用户要求获得快 照,基于这些留存的数据的统计信息才被显示出来。快照包括了运用轨范在一段时辰内的实行信息,常日有 CPU 快照和内存快照两品种型。
    • CPU 快照:次要包括了运用轨范中函数的挪用关系及运转时辰,这些信息常日可以在 CPU 快照视图中中止检查。
    • 内存快照:次要包括了内存的分配和行使情形、载入的一切类、存在的对象信息及对象间的引用关系等。这些信息常日可以在内存快照视图中中止检查。
  • 功效剖析:功效剖析是经由进程汇集轨范运转时的实行数据来匡助垦荒人员定位轨范需求被优化的部份,从而提高轨范的运转速度或是内存行使效率,次要有以下三个方面:
    • CPU 功效剖析:CPU 功效剖析的次要目的是统计函数的挪用情形及实行时辰,或更庞杂的情形就是统计运用轨范的 CPU 行使情形。常日有 CPU 扼守和 CPU 快照两种体式格式来显示 CPU 功效剖析效果。
    • 内存功效剖析:内存功效剖析的次要目的是经由进程统计内存行使情形检测可以存在的内存泄露成就及一定优化内存行使的倾向。常日有内存扼守和内存快照两种体式格式来显示内存功效剖析效果。
    • 线程功效剖析:线程功效剖析次要用于在多线程运用轨范中一定内存的成就所在。通俗包括线程的形态转变情形,逝世锁情形和某个线程在线程性命期内形态的散布情形等

VisualVM 安装

VisualVM 是一特功效剖析对象,自从 JDK 6 Update 7 往后已作为 Oracle JDK 的一部份,位于 JDK 根目录的 bin 文件夹下。VisualVM 自己要在 JDK6 以上的版本上运转,然则它可以监控 JDK1.4 以上版本的运用轨范。上面次要引见若何安装 VisualVM 和各类 VisualVM 上的插件。

安装 VisualVM

VisualVM 项目的官方网站今朝供应英文版本和多措辞支持版本下载。多措辞版本次要支持英语、日语和中文三种措辞。假定下载安装多措辞版本的 VisualVM,安装轨范会凭证操作零星的当前措辞情形去安装呼应 VisualVM 的措辞版本。最新 VisualVM 版本次要支持的操作零星包括:Microsoft Windows (7, Vista, XP, Server)、Linux、Sun Solaris、Mac OS X、HP-UX 11i。本文以 Microsoft Windows XP 为安装情形并支持中文。

  • VisualVM 项目的官方网站高下载 VisualVM 安装轨范。
  • 将 VisualVM 安装轨范解膨胀到外埠零星。
  • 导航至 VisualVM 安装目录的 bin 目录,然后启动 jvisualvm.exe。

安装 VisualVM 上的插件

VisualVM 插件*供应许多插件以供安装向 VisualVM 添加功用。可以经由进程 VisualVM 运用轨范安装,或从 VisualVM 插件*手动下载插件,然后离线安装。其他,用户还可以经由进程下载插件分发文件 (.nbm 文件 ) 安装第三方插件为 VisualVM 添加功用。

从 VisualVM 插件*安装插件安装步骤 :

  • 从主菜单中选择“对象”>“插件”。
  • 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。
  • 慢慢完成插件安装轨范。
图 1. VisualVM 插件治理器

使用 VisualVM 进行性能分析及调优

凭证 .nbm 文件安装第三方插件安装步骤 :

  • 从主菜单中选择“对象”>“插件”。
  • 在“已下载”标签中,点击”添加插件”按钮,选择已下载的插件分发文件 (.nbm) 并掀开。
  • 选中掀开的插件分发文件,并单击”安装”按钮,慢慢完成插件安装轨范。
图 2. 经由进程 .nbm 文件安装 VisualVM 插件

使用 VisualVM 进行性能分析及调优


功用引见

上面我们将引见功效剖析的几种罕有体式格式和若何行使 VisualVM 功效剖析对象中止剖析。

内存剖析

VisualVM 经由进程检测 JVM 中加载的类和对象信息等匡助我们剖析内存行使情形,我们可以经由进程 VisualVM 的扼守标签和 Profiler 标签对运用轨范中止内存剖析。

在扼守标签内,我们可以看到实时的运用轨范内存堆和永远留存区域的行使情形。

图 3. 内存堆行使情形

使用 VisualVM 进行性能分析及调优

图 4. 永远留存区域行使情形

使用 VisualVM 进行性能分析及调优

其余,我们也可以经由进程 Applications 窗口右击运用轨范节点来启用“在泛起 OOME 时生成堆 Dump”功用,当运用轨范泛起 OutOfMemory 破例时,VisualVM 将自动生成一个堆转储。

图 5. 开启“在泛起 OOME 时生成堆”功用

使用 VisualVM 进行性能分析及调优

在 Profiler 标签,点击“内存”按钮将启动一个内存剖析会话,等 VisualVM 汇集和统计完相关功效数据信息,将会显示在功效剖析效果。经由进程内存功效剖析效果,我们可以检查哪些对象占用了较多的内存,存活的时辰比拟长等,以便做进一步的优化。

其余,我们可以经由进程功效剖析效果下方的类名过滤器对剖析效果中止过滤。

图 6. 内存剖析效果

使用 VisualVM 进行性能分析及调优

CPU 剖析

VisualVM 可以监控运用轨范在一段时辰的 CPU 的行使情形,显示 CPU 的行使率、方法的实行效率和频率等相关数据匡助我们发明运用轨范的功效瓶颈。我们可以经由进程 VisualVM 的扼守标签和 Profiler 标签对运用轨范中止 CPU 功效剖析。

在扼守标签内,我们可以检查 CPU 的行使率和残存收受收受接管运动对功效的影响。太高的 CPU 行使率多是因为我们的项目中存在低效的代码,可以经由进程 Profiler 标签的 CPU 功效剖析功用中止具体的剖析。假定残存收受收受接管运动过于频仍,占用了较高的 CPU 成本,多是由内存缺少或是更生代和旧生代分配不合理致使的等。

图 7. CPU 行使情形

使用 VisualVM 进行性能分析及调优

在 Profiler 标签,点击“CPU”按钮启动一个 CPU 功效剖析会话 ,VisualVM 会检测运用轨范一切的被挪用的方法。当进入一个方法时,线程会发出一个“method entry”的事宜,当加入方法时一样会发出一个“method exit”的事宜,这些事宜都包括了时辰戳。然后 VisualVM 会把每一个被挪用方法的总的实行时辰和挪用的次数依照运转时长展现出来。

其余,我们也可以经由进程功效剖析效果下方的方法名过滤器对剖析效果中止过滤。

图 8. CPU 功效剖析效果

使用 VisualVM 进行性能分析及调优

线程剖析

Java 措辞可以很好的完成多线程运用轨范。当我们对一个多线程运用轨范中止调试或垦荒后期做功效调优的时辰,经常需求意见当前途序中一切线程的运转形态,能否是有逝世锁、热锁等情形的发生发火,从而剖析零星可以存在的成就。

在 VisualVM 的扼守标签内,我们可以检查当前运用轨范中一切运动线程和守护线程的数目等实时信息。

图 9. 生动线程情形

使用 VisualVM 进行性能分析及调优

VisualVM 的线程标签供应了三种视图,默许会以时辰线的体式格式展现。其他两种视图分离是表视图和具体信息视图。

时辰线视图上方的对象栏供应了削减,放除夜和自顺应三个按钮,和一个下拉框,我们可以选择将一切线程、运动线程或完成的线程显示在视图中。

图 10. 线程时辰线视图

使用 VisualVM 进行性能分析及调优

图 11. 线程表视图

使用 VisualVM 进行性能分析及调优

我们在具体信息视图中不只可以检查一切线程、运动线程和停止的线程的具体数据,而且也可以检查某个线程的具体情形。

图 12. 线程具体视图

使用 VisualVM 进行性能分析及调优


快照功用

我们可以行使 VisualVM 的快照功用生成随意率性特功效剖析快照并留存到外埠来辅佐我们中止功效剖析。快照为捕捉运用轨范功效剖析数据供应了一个很便捷的体式格式因为快照一旦生成可以在任什么时分刻离线掀开和检查,也可以互相传阅。

VisualVM 供应了两品种型的快照:

  • Profiler 快照:当有一特功效剖析会话(内存或 CPU)正在中止时,我们可以经由进程功效剖析效果对象栏的“快照”按钮生成 Profiler 快照捕捉其时的功效剖析数据。
图 13. Profiler 快照

使用 VisualVM 进行性能分析及调优

  • 运用轨范快照:我们可以右键点击左侧 Applications 窗口中运用轨范节点,选择“运用轨范快照”为生成一个运用轨范快照。运用轨范快照会汇集某一时辰的堆转储,线程转储和 Profiler 快照,同时也会捕捉 JVM 的一些根抵信息。
图 14. 运用轨范快照

使用 VisualVM 进行性能分析及调优


转储功用

线程转储的生成与剖析

VisualVM 可以对正在运转的外埠运用轨范生成线程转储,把运动线程的客栈踪影打印出来,匡助我们有用意见线程运转的情形,诊断逝世锁、运用轨范瘫痪等成就。

图 15. 线程标签及线程转储功用

使用 VisualVM 进行性能分析及调优

当 VisualVM 统计完运用轨范外线程的相关数据,会把这些信息显示新的线程转储标签。

图 16. 线程转储效果

使用 VisualVM 进行性能分析及调优

堆转储的生成与剖析

VisualVM 可以生成堆转储,统计某一特准时辰 JVM 中的对象信息,匡助我们剖析对象的引用关系、能否是有内存泄露情形的发生发火等。

图 17. 扼守标签及堆转储功用

使用 VisualVM 进行性能分析及调优

当 VisualVM 统计完堆内对象数据后,会把堆转储信息显示在新的堆转储标签内,我们可以看到摘要、类、实例数等信息和经由进程 OQL 掌握台实行查询语句功用。

堆转储的摘要包括转储的文件巨细、途径等根抵信息,运转的零星情形信息,也可以显示一切的线程信息。

图 18. 堆转储的摘要视图

使用 VisualVM 进行性能分析及调优

从类视图可以获得各个类的实例数和占用堆巨细数,剖析出内存空间的行使情形,找出内存的瓶颈,避免内存的过度行使。

图 19. 堆转储的类视图

使用 VisualVM 进行性能分析及调优

经由进程实例数视图可以获得每一个实例内部各成员变量的值和该实例被引用的位置。首先需求在类视图选择需求检查实例的类。

图 20. 选择查询实例数的类

使用 VisualVM 进行性能分析及调优

图 21. 实例数视图

使用 VisualVM 进行性能分析及调优

其余,还能对两个堆转储文件中止比拟。经由进程比拟我们可以剖析出两个时辰点哪些对象被除夜量树立或销毁。

图 22. 堆转储的比拟

使用 VisualVM 进行性能分析及调优

图 23. 堆转储的比拟效果

使用 VisualVM 进行性能分析及调优

线程转储和堆转储都可以另存成文件,以便中止离线剖析。

图 24. 转储文件的导出

使用 VisualVM 进行性能分析及调优


总结

本文首先简要枚举了一些功效剖析相关的配景常识。然后引见了 VisualVM 的下载和安装。最初从内存功效、CPU 功效、快照功用和转储功用四个方面睁开,进一步声名了若何行使 VisualVM 中止功效剖析。经由进程本文的引见,信任读者对功效剖析会有一定的意见,并可以行使 VisualVM 中止功效剖析。


作者:Noblog

转载于:https://my.oschina.net/yygh/blog/650507