性能分析利器总结一《VisualVM》
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自带工具jstack:jstack -l [pid] > thread.dump
线程dump中可看到几个参数:
- LoopThreadPool 线程/池名字
- prio 线程优先级,默认为5
- tid jvm线程ID,Thread.getId()获取到的就是它
- nid 真实操作系统线程id
那么,我们如何查cpu占用比较大的线程呢?
常规方法
- 查到java进程id(pid):
jps -m //方法一,jps:jdk自带工具
ps ef|grep java //方法二,Linux
tasklist|findstr java //方法三,Windows
- 查看该进程下的所有线程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等,不过都是收费的!
性能分析利器总结一《VisualVM》相关推荐
- mysql show profile详解_SQL 性能分析利器 show profile
本文首发个人公众号<andyqian>, 期待你的关注- 前言 在之前的文章中,我们提到过一些慢SQL优化的步骤.其中就包括:使用 explain 关键字来查看执行计划,是否命中索引. 通 ...
- Python性能分析利器pyinstrument讲解
一.前言 程序的性能也是非常关键的指标,很多时候你的代码跑的快,更能够体现你的技术.最近发现很多小伙伴在性能分析的过程中都是手动打印运行时间的方式来统计代码耗时的: import datetime s ...
- mysql火焰图_Linux 性能分析利器 -火焰图 flame graph
简述 Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具,返回 CPU 正在执行的函数名以及调用栈(stack). 通常,它的执行频率是 99Hz(每秒99次), ...
- dynaTrace Ajax:前端性能分析利器
什么是 dynaTrace Ajax 随着 jQuery.Dojo.YUI 等框架的兴起让构建 Web2.0 应用更加容易,但随之带来的定位等应用问题也越来越难,尤其是与性能相关的.dynaTrace ...
- Ajax 前端性能分析利器:dynaTrace
什么是 dynaTrace Ajax 随着 jQuery.Dojo.YUI 等框架的兴起让构建 Web2.0 应用更加容易,但随之带来的定位等应用问题也越来越难,尤其是与性能相关的.dynaTrace ...
- 性能分析利器:火焰图
什么是火焰图 火焰图(FlameGraph)是是由 Linux 性能优化大师 Brendan Gregg 发明的.通过 perf 等工具分析得到结果,看起来就像是火焰,这也是它的名字的由来.火焰图以一 ...
- perf+火焰图 = 性能分析利器
perf 1. perf安装 sudo apt install linux-tools-common 检查是否安装好 perf 如果出现 You may need to install the fol ...
- 前端性能分析工具利器
作者:basinwang,腾讯 PCG 前端开发工程师 大型项目容易遇到性能问题,一般来说,当我们遇到性能瓶颈的时候,才会开始去进行相应的分析.分析的方向除了业务本身的特点相关之外,常见的还可以借助一 ...
- java visualvm 教程_Java性能分析神器--VisualVM Launcher[1]
Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅: ...
最新文章
- python安装教程win8-python 2.7在win8.1上安装的方法
- 深度学习-Tensorflow2.2-卷积神经网络{3}-电影评论数据分类/猫狗数据集实例-15
- 解决NGINX PHP No input file specified
- js访问对方手机文件夹_求JS大神帮我写个利用JS来实现手机端和PC端访问自动选择样式文件代码...
- Java案例:Swing常用组件演示
- 仅用38天 2021年快递业务量已超100亿件
- Hyper-V实战:高可用性-配置Hyper-V群集
- day10 多进程、多线程(一)
- phalapi-进阶篇3(自动加载和拦截器)
- bbs.php168,PHP168 下载安装教程
- 专题三、ArrayList遍历方式以及效率比较
- 多页Excel转换成PDF时如何保存为单独文件
- 基于java+SpringBoot+HTML+Mysq幼儿园日常管理系统
- Chapter第六章
- espritcam后处理教学_Master CAM 后置处理文件及其设定方法详细说明
- css中子元素设置margin-top会影响到父元素
- 怎样申请MAC地址?
- 市场调研公司欧睿国际揭晓2019年十大全球消费趋势
- Unity3d 安卓开发问题总结
- 操作excel文件爬取nvd.nist数据
热门文章
- mysql复合索引、普通索引总结
- 屏下指纹+水滴屏,不一样的OPPO K1体验
- 技术社招!揭秘「剪映」技术团队如何从0到1打造爆款APP?
- flyme android7,Flyme系统适配安卓7后,你的魅蓝手机可变这么强
- pc端引入微信公众号文章
- 懂车帝推出朋友圈功能,你怎么看?
- 一加6android p降级包,国内最快!一加6更新Android P稳定版,官方确认一加6T会预装...
- vue页面绘图_Vue+Canvas绘图使用
- python数据分析水果_超酷炫的事情,使用python识别出图片里的水果
- Linux命令(一)——查看Linux的版本、CPU等系统信息