性能分析利器总结一《VisualVM》

article/2025/10/25 0:57:03

VisualVM

随着JDK7而出现,位于JDK根目录下的bin目录下。运行环境需JDK1.6及以上,能监控JDK1.4以上版本的应用程序。

  • 相比JConsole,感觉功能更强大,且可集成各类插件,使其更强大。Jconsole算是VisualVM的子集吧。另外VisualVM也有JConsole的插件;
  • 相比Arthas,它最大的特点肯定就是图形化了。Arthas必须得命令敲着走,且命令众多,不易上手(还全是英文……),并且它是JDK自带的!
  • 对于eclipse和idea(VisualVM Launcher),也有相应插件,可在软件界面快速打开visualvm。

对于性能分析,主要几个点即是:

  • 监控:实时CPU监控内存监控线程监控、其他监控;
  • 转储:从内存中获得当前状态数据并存储到文件用于后续分析,一般是线程信息转储、类加载信息转储,以及堆上对象的转储
  • 快照:cpu情况快照内存情况快照
  • 分析:程序中函数的调用关系运行时间内存分配及使用情况、载入的类、存在的对象信息等。

而VisualVM对这几个点做得都还是蛮不错的,下面进行一一说明。

转储和快照

而对于VisualVM,从界面上即可看到:

它支持线程转储、堆转储,并且支持在发生OOM时立即转储堆(Arthas没有做到这一点)。同时拥有应用程序快照,快照生成后可查看线程快照、cpu、内存、类等使用情况。

另外概述一栏,可方便地看到系统信息、JVM参数等,对于JVM参数调优这些,它用起来很友好!

线程转储

上图我们可以看到有一个“线程dump”,线程转储后,可看到各个线程当前时间正在做什么事情:

线程dump看到的是当前时刻线程的一个状态,可以看到线程是否在运行、多个线程是否在资源竞争;

多次dump进行对比可排查线程是否存在问题,如多次dump,发现某一个线程一直在调某个方法,则可说明该方法可能有些问题。

针对线程转储,也可使用jdk自带工具jstackjstack -l [pid] > thread.dump

线程dump中可看到几个参数:

  • LoopThreadPool 线程/池名字
  • prio 线程优先级,默认为5
  • tid jvm线程ID,Thread.getId()获取到的就是它
  • nid 真实操作系统线程id

那么,我们如何查cpu占用比较大的线程呢?

常规方法
  1. 查到java进程id(pid):
jps -m  //方法一,jps:jdk自带工具
ps ef|grep java  //方法二,Linux
tasklist|findstr java  //方法三,Windows
  1. 查看该进程下的所有线程id:
top -Hp [pid]  //方法一,Linux
Process Explorer工具直接找到进程下cpu占用比较大的线程  //方法二,Windows

后续还可根据线程id,去线程dump文件分析相应线程的信息
需要把线程id转换为十六进制,再去dump文件中查相应nid。

Visualvm

VisualVM的 抽样器 -> CPU -> 线程CPU时间 可直接看到

Arthas

thred top [n] 命令可直接看到前n个线程

堆转储

图中有一个“堆dump”,堆转储后,可看到jvm堆在当前时间的一个状态:

图中可清晰地看到哪些类对象占用内存比较大,并且参考线程dump,你也可以进行多次堆dump,然后进行堆转储比较。

VisualVM在堆转储上的优势:

  • 能可视化直观地看到哪些类对象占比比较大,并且支持排序;
  • 支持两个堆转储比较(见图右上角);
  • 支持过滤快速查找类名(见图左下角);
  • 支持OQL控制台查询;
  • 支持点击某个类,可直观地看到该类的所有实例信息:重要

快照

图中有一个“应用程序快照”,快照后,可看到当前时间cpu、内存、类、线程情况。

监控

对于监控,VisualVM的监视一栏,可实时可视化查看cpu、内存、类、线程情况:

个人感觉,对于实时监控方面,VisualVM的确做的不错。另外从图中来看,CPU使用情况一图中,CPU的飙升是因为垃圾回收活动的频繁,而垃圾回收的频繁往往是因为内存占用的暴增。

小案例

之前遇到过一个服务器内存占用过大的情况:程序是从ES中查询数据到程序,查询的数据大小不一,大部分数据在3个G以内,极少部分达到7个G

默认情况下,初始Xms=物理内存/64,默认Xmx=物理内存/4(如服务器内存是32G,即JVM最大内存可为8G),并且默认XX:MinHeapFreeRatio=40%,XX:MaxHeapFreeRatio=70%(即空闲的堆在40%-70%正常,小于则会扩充,当内存不够则报内存溢出,大于则会缩减)。

因此程序在接收到7个多G的数据时,把堆内存调为了8G。而事实上,大部分时间,堆上内存占用都在3G以内(空闲堆比例=(8-3)/8=62.2%,不会进行内存缩减),这时,总有5个G的空闲内存被JVM浪费掉。因此,可重新调整上面两个最小、最大空闲堆比例来解决。

线程监控

对于线程的可视化实时监控,它无疑也是很强大的:

图中我们可以看到,我有两个线程池:EsIO的线程池,负责对ES的IO请求,另一个是Web线程池,它负责分析ES查询的数据。

利用该图,我们可以清晰地看到:

  • 各线程池名字,由图也可看出,我们在编写线程池时,带上线程名字更容易后续问题排查:
this.pool = new ThreadPoolExecutor(threadNum, threadNum, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(),new ThreadFactoryBuilder().setNameFormat(threadName + "-%d").build(),new ThreadPoolExecutor.AbortPolicy());
  • 线程池是否是在并行执行(废话,线程池肯定是并行执行,但是有时我们会不知不觉出问题,如线程池中的线程存在资源竞争,也可能会导致线程串行执行)。看多个线程是否会并行运行,只需关注绿条是否会出现重叠
  • 哪些线程池长期处于空闲状态,如果发现某线程池中较多线程长期空闲,即可减少线程数量,分析出“最优线程数”(当然真正的“最优线程数”还得根据QPS、PV等综合决定)。同理,如果线程池长期繁忙,则可考虑增大线程数量(在增加、减少线程数时,也需结合CPU、内存、带宽等因素综合判断)。

分析

VisualVM的抽样器一栏可用于进行实时性能分析,做的很给力,我们可以看到下图:

  • CPU样例 是站在“方法”的角度,可以看到各个方法的自用时间,方便进行代码分析。

  • 线程CPU时间 则是站在“线程”的角度,看到各个线程的自用时间。同时左下角均支持方法名/线程名过滤。

对于“方法”的执行时间,如果觉得看着不是很直观,你还可以把当前实时监控打一个Profiler快照(CPU样例下面有个按钮),该快照以方法调用树的形式,展示了各线程方法调用栈的执行时间:

还可以分析热点方法:

小结

Visualvm做转储、快照、监控、分析都还是蛮好的,JDK自带,执行jvisualvm即可唤出。对于类似的分析工具,还有JProfiler、Yourkit等,不过都是收费的!


http://chatgpt.dhexx.cn/article/NvOQKBXH.shtml

相关文章

VM 和 VC

一、vm 1、Vue的实例对象&#xff0c;以后简称vm。 (1) vm的隐式原型属性指向Vue的原型对象。 (2) VueComponent的原型对象的隐式原型属性指向Vue的原型对象。 二、vc 1、组件本质&#xff1a; 组件其实是一个名为VueComponent的构造函数&#xff0c;且不是程序员定义的&am…

杂记十五:VisualVM使用教程

一、插件下载 1.安装jdk并启动jvisualvm.exe 2.插件安装 点击已下载&#xff0c;第一次开启的时候已下载里面是空的&#xff0c;需要点击添加插件把已经下载的插件添加到已下载中。 如何下载插件&#xff1f; 下载地址&#xff1a;https://visualvm.github.io/pluginscente…

【visual studio】VsVim 2022

看起來很方便使用是VS的擴展和兼容VsVim配置教程VsVim使用教程&#xff08;以及简要vim介绍&#xff09;四种模式&#xff1a;normal,insert,visual,command True 那么有一个专门的命令模式的输入框 这个框还是很有必要的 vs的标签页之间切换 用ctl w 即可。我用的是小写的…

VisualVM使用方法

1、VisualVM 简介 VisualVM 是一个工具&#xff0c;它提供了一个可视界面&#xff0c;用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序&#xff08;Java 应用程序&#xff09;的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检…

性能分析神器VisualVM

性能分析神器VisualVM VisualVM 是一款免费的&#xff0c;集成了多个 JDK 命令行工具的可视化工具&#xff0c;它能为您提供强大的分析能力&#xff0c;对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析…

VisualVM安装,插件安装,各个面板信息讲解

本篇博文目录: 1.什么是VisualVM2.VisualVM安装3.VisualVM相关说明(各个面板信息)4.VisualVM安装插件(安装GC插件) 1.什么是VisualVM ① VisualVM 提供可视界面&#xff0c;用于查看 JVM运行应用程序的详细信息 ② VisualVM可以提供大量可视化的运行指标,是Java工程师最佳分析工…

java基础工具VisualVM介绍与详细使用

1.美图 2.介绍 官网 : http://visualvm.github.io/ VisualVM是JDK自带的一个用于Java程序性能分析的工具 VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。您…

VisualVM工具的使用

VisualVM工具的使用 VisualVM&#xff0c;能够监控线程&#xff0c;内存情况&#xff0c;查看方法的CPU时间和内存中的对 象&#xff0c;已被GC的对象&#xff0c;反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。 VisualVM使用简单&#xff0c;几乎0配置&…

threejs加载obj文件

threejs加载并展示obj文件&#xff1a; 研究了一段时间&#xff0c;总结下&#xff0c;废话少说&#xff0c;直接上代码&#xff1a;<!DOCTYPE html> <html lang"en"><head><title>three.js webgl - loaders - OBJ loader</title><…

Java3D加载obj文件+mtl文件

Java3d入门学习可以参考这位博主大神——苏若年&#xff0c;关于Java3D学习的文章。下面给出他部分文章的链接&#xff1a; 文1 创建三维几何模型:[ http://www.cnblogs.com/dennisit/archive/2013/05/06/3063042.html ] 文2 加载外部Obj模型:[ http://www.cnblogs.com/dennisi…

[OpenGL]导入obj文件

通常来说我们构建一个模型是比较复杂的工作&#xff0c;那么我们还有什么途径获得模型呢。其中一种方法就是导入obj模型&#xff0c;不要被这个名词给吓到了&#xff0c;其实就是把一个制作好的模型保存到一个文件中&#xff0c;我们称为obj文件。 先上图片&#xff1a; 下面说…

vue 加载3D .obj文件

VUE项目 vue-cli 加载obj obj文件存放位置 public/static vue 引入obj 控件&#xff1a;Vue-3D-Model 安装&#xff1a;npm install vue-3d-model <!-- ThreeDCity.vue文件 --> <template><div class"ThreeJSCity"><model-obj class"…

glb转obj文件及构建简单obj文件

目录 一、转换二、构建1三、构建2 一、转换 提供几个转换的网址&#xff1a; https://anyconv.com/glb-to-obj-converter/ https://products.aspose.app/3d/conversion/glb-to-obj https://miconv.com/convert-glb-to-obj/ 二、构建1 自己构建简单obj&#xff1a; 新建文本文…

obj文件(1):obj文件用txt打开并且了解v,f,vn,vt的含义

obj文件:obj文件用txt打开并且了解v,f,vn,vt的含义 笔记obj文件的格式介绍**下载 Blender 软件** 来源&#xff1a;《Computer Graphics Programming in OpenGL Using C 》by V Scott Gordon John L Clevenger内容&#xff1a;介绍obj文件以txt文本形式打开后的标签v,f,vn,vt&a…

什么是obj文件

此文来源&#xff1a;https://www.cnblogs.com/ShadowHanlder/p/4410213.html 百度百科&#xff1a; 程序编译时生成的中间代码文件。目标文件&#xff0c;一般是程序编译后的二进制文件&#xff0c;再通过链接器(LINK.EXE)和资源文件链接就成可执行文件了。OBJ只给出了程序的…

Unity导出模型为Obj文件

Unity导出模型为Obj文件 资源链接下载导入 代码纪要使用方式参考链接 资源链接 原插件代码中只有MeshFilter的Obj导出代码&#xff1b;由于项目需求&#xff0c;需要将SkinnedMeshRenderer导出为Obj文件&#xff0c;故在原代码的基础上&#xff0c;扩展出了SkinnedMeshRendere…

SolidWorks2021导出带材质的OBJ文件

SolidWorks2021导出带材质的OBJ文件 注意SW中所有零件都要使用英文命名&#xff0c;装配体模式下再次新建宏按钮即可 1. 首先下载并安装工具宏 1.1 下载免费工具宏 到Github下载免费的Free-Solidworks-OBJ-Exporter&#xff0c;并解压到自己想要的保存的位置。 1.2 在Soli…

C++/OpenGL 入门(18):读取obj文件并贴图

来源&#xff1a;《Computer Graphics Programming in OpenGL Using C 》by V Scott Gordon John L Clevenger内容&#xff1a;程序6.3 Simple (Limited) OBJ Loader 简单的obj文件读取器&#xff0c;书P152页&#xff0c;PDF171/403 结果 生成&#xff1a; 读取&#xff1a;…

unity动态加载obj文件

unity2018.4.2f1 vs2017 最近项目需求&#xff0c;需要实现动态读物外部obj模型&#xff0c;并加载到场景中&#xff0c;研究了好几天&#xff0c;终于实现了&#xff0c;在此做个记录。 1、首先随便找个.obj模型&#xff0c;带贴图&#xff0c;我的资源截图如下&#xff1a…

obj文件(3): 如何用matlab 打开obj文件

obj文件:如何用 matlab 打开 obj 文件 第一步&#xff1a;检查obj文本格式第二步&#xff1a;用 Blender 软件重新导出obj文件第三步&#xff1a;用excel 打开这个obj 文件第四步&#xff1a;复制excel中的数据&#xff0c;传给matlab第五步&#xff1a; 用matlab 打开3D模型 第…