前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 VisualVM 和 JProfiler 进行性能分析及调优

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

原创
作者头像
CG国斌
修改于 2020-06-22 06:25:17
修改于 2020-06-22 06:25:17
3.5K0
举报
文章被收录于专栏:维C果糖维C果糖

版权声明:本文的内容源自于「IBM Developer」的博文,以对原文做重大更新,并新增 JProfiler 的内容。

概述

在我们开发大型 Java 应用程序的过程中,难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。在本文中,我们主要介绍 VisualVM 和 JProfiler 这两款性能分析工具。

背景知识

性能分析的主要方式

  • 监视:监视是一种用来查看应用程序运行时行为的一般方法。通常会有多个视图(View)分别实时地显示 CPU 使用情况、内存使用情况、线程状态以及其他一些有用的信息,以便用户能很快地发现问题的关键所在。
  • 转储:性能分析工具从内存中获得当前状态数据并存储到文件用于静态的性能分析。Java 程序是通过在启动 Java 程序时添加适当的条件参数来触发转储操作的。它包括以下三种:
    • 系统转储:JVM 生成的本地系统的转储,又称作核心转储。一般的,系统转储数据量大,需要平台相关的工具去分析,如 Windows 上的windbg和 Linux 上的gdb等。
    • Java 转储:JVM 内部生成的格式化后的数据,包括线程信息,类的加载信息以及堆的统计数据。通常也用于检测死锁。
    • 堆转储:JVM 将所有对象的堆内容存储到文件。
  • 快照:应用程序启动后,性能分析工具开始收集各种运行时数据,其中一些数据直接显示在监视视图中,而另外大部分数据被保存在内部,直到用户要求获取快照,基于这些保存的数据的统计信息才被显示出来。快照包含了应用程序在一段时间内的执行信息,通常有 CPU 快照和内存快照两种类型。
    • CPU 快照:主要包含了应用程序中函数的调用关系及运行时间,这些信息通常可以在 CPU 快照视图中进行查看。
    • 内存快照:主要包含了内存的分配和使用情况、载入的所有类、存在的对象信息及对象间的引用关系等。这些信息通常可以在内存快照视图中进行查看。
  • 性能分析:性能分析是通过收集程序运行时的执行数据来帮助开发人员定位程序需要被优化的部分,从而提高程序的运行速度或是内存使用效率,主要有以下三个方面:
    • CPU 性能分析:CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。通常有 CPU 监视和 CPU 快照两种方式来显示 CPU 性能分析结果。
    • 内存性能分析:内存性能分析的主要目的是通过统计内存使用情况检测可能存在的内存泄露问题及确定优化内存使用的方向。通常有内存监视和内存快照两种方式来显示内存性能分析结果。
    • 线程性能分析:线程性能分析主要用于在多线程应用程序中确定内存的问题所在。一般包括线程的状态变化情况,死锁情况和某个线程在线程生命期内状态的分布情况等。

VisualVM

VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。

安装方法

由于 VisualVM 已经被 Oracle 在 GitHub 上开源了,因此我们可以直接在 GitHub 上下载安装包。

进入visualvm的项目首页后,点击releases选项:

visualvm
visualvm

如上图所示,点击releases之后,我们可以看到visualvm的所有稳定发布版:

visualvm-releases
visualvm-releases

如上图所示,VisualVM 已经更新至 2.0.2 版本,我们可以选择自己想要安装的版本,点击下载之后,自行安装即可。

使用方法

visualvm
visualvm

如上图所示,以 Mac 为例,演示 VisualVM 2.0 版本的使用:

remote
remote

如上图所示,打开 VisualVM 之后,进入如上界面。在这里,我们主要关注LocalRemote,其中:

  • Local,监控本地进程;
  • Remote,监控远程进程。

默认情况下,启动 VisualVM 之后,就会自动监控本地的 Java 进程。但是,如果我们想要监控远程的 Java 进程,则需要进行配置。右键点击Remote,选择Add Remote Host,进入如下页面:

add-remote-host
add-remote-host

如上图所示,在Host name框中输入我们想要监控的远程主机的 IP,如172.12.21.234;至于Display name,我们可以理解为别名或者昵称,自定义即可,完成后,点击OK按钮:

add-jmx-connection
add-jmx-connection

如上图所示,连接到指定的主机之后,我们还需要指定想要监控的端口。右键点击已连接的主机,选择Add JMX Connection,新增 Java 管理扩展连接,进入如下页面:

jmx-port-25600
jmx-port-25600

如上图所示,在Connection中默认会回显主机 IP,我们只需要输入想要监控的端口即可,在这里,我们指定端口为25600,输入完成后,点击OK按钮:

jar-info-pid
jar-info-pid

如上图所示,VisualVM 已经连接到我们指定的主机以及端口。其中,在上图的右侧部分,已经显示了进程的部分信息,如 PID、Host、Main class、Java 版本和 JVM 启动参数等。但是在这里,我们需要特别注意一点,那就是:我们输入的25600端口并不是随便输入的,而是需要我们事先在启动脚本或者启动参数中配置的。具体的配置示例,如下:

代码语言:txt
AI代码解释
复制
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=25600 \

现在,我们已经监控到指定的进程了。接下来,我们一起来看看如何查看更为详细的监控信息。首先,我们右键点击已经连接的服务:

heap-thread-dump-snapshot
heap-thread-dump-snapshot

如上图所示,右键菜单中展示了 Open、Sample、Thread Dump 和 Head Dump 等功能,其中:

  • Thread Dump,获取线程转储;
  • Head Dump,获取堆转储;
  • Application Snapshot,获取应用运行状态快照。

在这里,以Application Snapshot为例,点击之后,VisualVM 会生成一个应用当前运行状态的快照,并将其存储到Snapshats一栏,如上图左侧红色方框标记所示。点击生成的快照之后,会在右侧会显示快照信息。同样,点击Thread DumpHead Dump之后,会生成对应的线程转储和堆转储,只不过存储的位置会略有不同。

overview
overview

如上图所示,我们看 VisualVM 的右侧页面,包括 Overview、Monitor、Threads、Sampler 和 Visual GC 等,其中:

  • Overview,进程信息概览,包括 JDK 版本、JVM 启动参数和环境变量配置等信息;
  • Monitor,图形化监控页面,包括 CPU、内存、类以及线程等信息,可以手动触发 GC 以及执行堆转储;
  • Threads,线程信息,可以查询进程内线程活动情况,可以执行线程转储;
  • Sampler,采样器,可以实时采集 CPU、内存等信息;
  • Visual GC,监控垃圾收集情况,想要使用此功能需要我们事前在启动脚本或者启动命令中进行配置。

上图就是 Overview 页面的内容。接下来,我们再来看看 Monitor、Threads 以及 Sampler 的页面。

Monitor
monitor-cpu-threads
monitor-cpu-threads

如上图所示,就是 Monitor 页面的内容,包括 CPU、Memory、Classes 和 Threads,其中:

  • CPU,实时显示 CPU 使用率以及 GC 活动比例;
  • Memory,实时显示堆使用情况,包括Metaspace,JDK 8 之前是PermGen
  • Classes,实时显示类加载情况;
  • Threads,实时显示线程的数量,包括总线程数量以及守护线程数量。

在这里,我们可以通过勾选上面的选择框自定义显示样式,像上面就仅勾选了CPUThreads

monitor-cpu-memory-classes-threads
monitor-cpu-memory-classes-threads

如上图所示,勾选了CPUMemoryClassesThreads四个选项。同时,我们也可以点击Perform GC按钮,手动触发 GC;点击Heap Dump按钮,可以导出堆转储信息。

Threads
threads
threads

如上图所示,就是 Threads 页面的内容,显示了线程的活跃情况。同时,点击Thread Dump,可以导出线程转储信息

Sampler
sampler
sampler

如上图所示,就是 Sampler 页面的内容,可以采集 CPU 和内存的信息。当我们点击CPU或者Memory按钮之后,开始执行采样,点击Stop即可结束采样。上图为 CPU 采样的结果,显示了各个线程占用 CPU 的情况;点击Memory,可以切换到内存的采样结果:

sampler-memory
sampler-memory

如上图所示,就是内存的采样结果,显示各个类型对象占用的内存情况。

同样,在 Sampler 页面,我们也可以找到手动触发 GC、导出堆转储以及线程转储的按钮。

JProfiler

JProfiler 是由 EJ 技术有限公司针对 Java 应用程序开发的性能监控工具,可以对 JVM 进行精确的监控,其中堆遍历、CPU 剖析、线程剖析是定位当前系统瓶颈的有效手段。与 Oracle 开源的 VisuaVM 相比,JProfiler 的功能更为强大,但 JProfiler 却是一个重量级的 JVM 监控工具,当启动 JProfiler 监控的时候,会使得 CPU 的使用率显著飙升。

安装方法

首先,进入 EJ 官方的 JProfiler 下载地址:

点击上述链接后,进入如下页面:

jprofiler
jprofiler

如上图所示,自行选择需要安装的版本,然后点击DOWNLAOD按钮,下载 JProfiler 安装包。

特别地,JProfiler 需要激活使用,至于激活的方法,网上有很多,大家自己搜索即可。

使用方法

Em.....,网上有很多,我就先不写了,直接给出一些链接,大家跳过去参考下吧,捂脸!

如上述链接所示,这是我感觉写的很不错的两篇文章,在此分享给大家。


参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 VisualVM 进行性能分析及调优
开发大型 Java 应用程序的过程中难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。
Java架构师历程
2018/09/26
2.6K0
使用 VisualVM 进行性能分析及调优
Java性能调优:利用VisualVM进行性能分析
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。
朝雨忆轻尘
2019/06/19
1.7K0
Java性能调优:利用VisualVM进行性能分析
JVM性能分析神器-VisualVM
JVM本身为我们提供了很多性能监控的工具,其中有基于命令行的也有基于图形用户界面的,而个人感觉VisualVM就是其中最优秀的一个工具。
Java学习录
2019/05/17
9920
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
在Java开发中,性能优化是提升应用效率的关键步骤。本文将介绍两款常用的Java性能分析工具——JProfiler和VisualVM,以及它们如何帮助我们识别并解决性能问题。
Jimaks
2024/05/28
5930
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
Java 性能分析 5 大工具
上一篇文章我们分享了 Java 性能分析 的理论知识,相信一定有人跃跃欲试了,下面轮到了实践环节,本文将会重点介绍 5 大分析利器,让各位在进行Java 性能分析的时候如虎添翼,更上层楼。
FunTester
2025/01/23
1800
Java 性能分析 5 大工具
Java 性能分析
在企业开发中,Java 依然占据着举足轻重的地位,但即使是最坚固的应用程序也可能面临性能下降的问题。在当今快节奏的数字世界里,识别并解决这些瓶颈变得尤为重要。这时,Java 分析器便成为您的秘密武器,帮助解决这些性能挑战。
FunTester
2025/01/23
680
Java 性能分析
JVM-12虚拟机性能监控与故障处理工具之【JDK的可视化工具-VisualVM】
Visual VM (All-in-One Java Troubleshooting Tool)是目前为止随JDK发布的功能最强大的运行监视和故障处理程序。 Visual VM除了提供运行监视、故障处理外,还提供了比如性能分析(Profiling),对应用程序的实际性能影响很小,使得它可以直接应用在生产环境,这个优点是JProfiler、YourKit等第三方的性能分析工具无法比拟的.
小小工匠
2021/08/17
5110
java性能分析与常用工具
jdk提供的这些工具都是使用java语言编写的,他们都来自于lib/tools.jar,解压tools.jar,然后找到它下面sun/tools,截图如下,可以很清楚的能够看到这些目录的名称和前面看到的工具的名称一致。
千羽
2021/01/14
1.3K0
java性能分析与常用工具
VisualVM工具
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
乐心湖
2021/01/18
8540
VisualVM工具
Java性能诊断与调优工具:如何使用 JDK 自带工具(jstat、jmap、jvisualvm)进行性能分析?
本文将详细解析 JDK 自带的性能分析工具,结合实际案例展示如何利用 jstat、jmap 和 jvisualvm 分析内存、线程和 GC 性能问题,并提出优化策略。
猫头虎
2024/12/24
4400
Java 性能调优工具
检查应用性能时,应该首先审查CPU时间。 代码优化的目的是提升而不是降低(更短时间段内的)CPU的使用率。 在试图深入优化应用前,应该先弄清楚为何CPU使用率低。
全栈程序员站长
2022/08/05
6330
性能优化-VisualVM工具的使用
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
cwl_java
2020/02/13
6.5K0
分享几款超好用的JVM调优工具,建议收藏!
在之前的文章中,我们介绍了 JVM 常用的命令使用,通过这些命令可以快速的查询线上服务的性能情况和排查相关的问题。
Java极客技术
2024/04/25
3.5K0
分享几款超好用的JVM调优工具,建议收藏!
IDEA集成Java性能分析神器JProfiler
《eclipse集成Java性能分析神器JProfiler》讲解了eclipse集成Jprofiler,这篇讲解一下IDEA如何集成JProfiler。
BUG弄潮儿
2020/06/12
4.7K0
IDEA集成Java性能分析神器JProfiler
JDK监控和故障处理工具总结
jps(JVM Process Status) 命令类似 UNIX 的 ps 命令。
Vincent-yuan
2021/09/08
3690
jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形
纯洁的微笑
2018/04/19
1.4K0
jvm系列(七):jvm调优-工具篇
深入理解 Java 虚拟机-如何利用 VisualVM 对高并发项目进行性能分析
前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能,这篇文章就介绍一下如何利用VisualVM进行性能分析,以及在分析之前需要知道一些GC优化的原则,GC优化的目的,以及遇到问题时怎么去解决问题的方法。
好好学java
2019/12/19
4860
JVM-VisualVM:多合-故障处理工具
VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。
逍遥壮士
2021/12/01
3840
JVM-VisualVM:多合-故障处理工具
【性能优化】Jprofiler基础知识汇总
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
Luga Lee
2022/03/25
8510
【性能优化】Jprofiler基础知识汇总
JVM学习.05 JVM常见的排障和调优
前面介绍了JVM相关的内存和线程相关的技术。对于JVM也算有了一个比较系统、完整的理论基础。理论总是作为指导实践的工具,但是从理论到实践,总会遇到一些虚拟机相关问题,故障。所以还需要学习一些常用的JVM排障工具,和一些常见的调优手段。
有一只柴犬
2024/01/25
2410
JVM学习.05 JVM常见的排障和调优
推荐阅读
相关推荐
使用 VisualVM 进行性能分析及调优
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档