使用Java VisualVM分析您的应用程序

当您需要发现应用程序的哪个部分消耗更多的CPU或内存时,必须使用探查器执行此操作。

默认情况下,Sun JDK中附带的一个探查器是Java VisualVM。 这个事件探查器非常简单易用,功能强大。

在这篇文章中,我们将看到如何安装它并使用它来分析应用程序。
通常,无需安装它,因为它与JDK一起安装。 但是在几个Unix系统中,例如Ubuntu,情况并非如此。 如果要安装它,只需使用apt-get(或aptitude):

须藤apt-get install visualvm

要启动它,只需启动jvisualvm(Windows的jdk的bin目录中的jvisualvm.exe)。
这将打开以下窗口:

这里没有很多有趣的东西。 要分析应用程序,只需启动它,VisualVM就会检测到它已启动:

之后,您只需双击以查看有关正在运行的应用程序的信息。 您有四个选项卡可用于您的应用程序(“概述”,“监视器”,“线程”,“探查器”)。 我们将看到所有这四个标签。 首先,默认选项卡,概述:

此选项卡包含有关已启动的应用程序的主要信息。 您可以看到主类,命令行参数和JVM参数。 您还可以查看哪种类型的JVM正在运行您的程序以及JVM所在的位置。 您可以看到该程序中设置的所有属性。
一个更有趣的标签是“监视器”标签:

此选项卡跟踪您的应用程序的CPU和内存使用情况。 您在此视图中有4个图。 第一个从左到右,从上到下显示CPU使用率和Garbage Collector CPU使用率。 第二张图显示堆空间和PermGen空间的使用情况。 下一个图显示了应用程序中加载的类的总数,最后一个图显示了当前正在运行的线程数。 通过这些图,您可以查看应用程序占用的CPU过多还是应用程序占用的内存过多。

第三个选项卡提供有关Threads的一些详细信息:

在此视图中,您可以看到应用程序的不同线程如何改变状态以及它们如何演变。 您还可以查看每次进入每种状态的时间,并且可以了解有关所需线程的详细信息。
现在,我认为最有趣的标签是Profiler之一:

第一次打开此选项卡时,它根本不包含任何信息。 您必须先进行一种分析,然后才能查看信息。 我们将从CPU分析开始。 只需单击CPU按钮,仪器就会启动。 检测期间,该应用程序将被阻止。 检测完成后,您可以再次访问该应用程序,并且将在表中显示概要分析的结果。 当然,分析会对您的应用程序造成负担。 通常它是不可见的,但是对于某些应用程序,您可能会失去很多流动性。 这是我通过简单的应用程序获得的结果:

在我的示例中,我们可以看到waitForTimeout方法占用了CPU时间的81.6%。 我们还可以看到,notifyDecision和getSensor方法是紧随其后的两个最消耗CPU的方法,也许对它们进行优化很有趣。 您还可以查看每个方法的调用次数,也许您会发现一个调用时间过多的方法。

我们可以做的下一个性能分析是内存性能分析。 再次在这里,您必须开始分析,仪器将启动,在此期间,应用程序将被冻结。 这是我的申请结果:

在这里,我们可以看到该应用程序存储了一些大的double []和float []数组,EllipseIterator和BasicStroke类也占用了大量的内存空间。
在内存和CPU性能分析中,您都可以将结果保存到文件中以供日后查看。 例如,您可以让应用程序通宵工作,早上保存结果并检查结果,或者进行三个性能分析并比较三个结果。

总而言之,我不得不说这个探查器非常简单,但是使用起来却非常强大。 我们拥有分析器所需的主要功能,并且效果非常好。 这种工具确实可以帮助您改进应用程序,以减少CPU和内存的使用。 当然,这种工具并不能解决所有问题,它只是帮助显示必须改进应用程序的哪一部分,改进部分是开发人员的任务,而不是最简单的。 但是拥有这种工具是一个好的开始。

参考:通过@Blog(“ Baptiste Wicht”)的 JCG合作伙伴 Baptiste Wicht 使用Java VisualVM对应用程序进行概要分析 。

相关文章 :

  • 从CLI监视OpenJDK
  • 绩效焦虑–关于绩效不可预测性,度量和基准
  • JVM选项:-client vs -server
  • Java中的低GC:使用原语而不是包装器

翻译自: https://www.javacodegeeks.com/2012/01/profile-your-applications-with-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接

ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接安装ArcSDE for SQL Server,最后一步成功后的界面如下:在ArcMap中创建ArcSDE连接,截图如下:posted on 2016-08-0…

java反射main方法参数注意

public class ReflectMethodMain {public static void main(String[] args) throws Exception {Method methodMainTestArgument.class.getMethod("main", String[].class);/*jdk 1.4之前的版本不支持可变参数,对组类的参数会自动拆包然后用来匹配数据参数…

python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

在Python语言中,可以使用ctypes模块调用其它如C语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件的功能及应用领域,减少重复编写代码、…

沁恒CH554 KEIL环境搭建

首先下载WCHISPTool_Setup.exe http://www.wch.cn/products/CH554.html 123这三个可下载的都下吧,后面开发都要用的 安装好后运行,菜单栏上,功能->添加WCH MCU到KEIL器件库 这时候在KEIL安装目录里面的UV4文件夹下可以看到wch.cdb的文件…

【CV论文阅读】Rank Pooling for Action Recognition

这是期刊论文的版本,不是会议论文的版本。看了论文之后,只能说,太TM聪明了。膜拜~~ 视频的表示方法有很多,一般是把它看作帧的序列。论文提出一种新的方法去表示视频,用ranking function的参数编码视频的帧序列。它使用…

java不要在常量和变量中出现易混淆的字母

public class proposal {public static void main(String[] args) {long i1l; System.out.println("i的两倍是:"(ii));System.out.println("i的两倍是:"ii); //注意此处和上面的有很大的区别} }输出:211/** 注意:* …

VS2019 WPF制作OTA上位机(一)新建工程

首先创建新项目,文件 -> 新建 -> 项目 下拉菜单选择C#和Window,选择WPF应用程序,下一步 输入项目名,下一步 这里选择.NET 5.0,也可以选择其他的,个人习惯.NET,点击创建 这时候出现初始…

户籍恢复需要体检吗_脑梗死后脚麻能恢复吗?需要多久能恢复呢?

脑梗死之后脚部麻木,这个有一部分是能够恢复的,但是相对而言,恢复的时间比较长,在临床当中出现脚麻主要是因为梗死破坏了患者的感觉神经中枢从而造成。脚部感觉麻木,瘙痒或者是有蚂蚁在上面爬的感觉。而且有的更加严重…

Alpha版本测试报告

一、测试计划 Alpha版本即将发布,我们组织队员进行这一版本的测试。 测试主要针对两方面:浏览器兼容性和功能完善性。 测试分兼容性测试与功能完善性两部分,兼容性测试分Windows操作系统、Linux系操作系统、Mac OS X操作系统以及手机端Androi…

在J2SE应用程序中模拟CDI的会话和请求范围

我们目前正在考虑将Naked Objects框架重构为使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI)。 使用香草JSR-330是不费吹灰之力的,但是我们想利用JSR-299中的一些不错的功能(例如事件和装饰器&#xff…

VS2019 WPF制作OTA上位机(二)获取bin文件路径

OTA升级是通过无线通信远程把bin文件内容传输到单片机,完成升级。 因此上位机需要获取bin文件的路径,读取bin文件内容,将内容分割依次发送(因为单片机的接收缓存不会开得和bin文件一样大(十几K甚至几十K)&a…

java 线程“生产/消费”模型1

/*资源类*/ public class ShareValue {private int total;public ShareValue(int total){this.totaltotal;}//生产void putValue(int value){totalvalue;}//消费资源int getValue(int value){if(total-value>0){total-value;}else{valuetotal;total0;System.out.println(&qu…

PHP - 代码分离

总代码&#xff1a; <?php/** Version&#xff1a;1.0* CreateTime&#xff1a;2015年11月11日* Author&#xff1a;HF_Ultrastrong*///引入公共文件,在公共文件中创建&#xff0c;相对于项目的绝对路径require dirname(__FILE__)./includes/common.inc.php; ?&…

原生js封装table表格操作,获取任意行列td,任意单行单列方法

V1.001更新增加findTable-min.js 本次更新&#xff0c;优化了代码性能方面&#xff0c;增加了部分新功能&#xff0c;可以获取多个table表格批量操作。 考虑到本人后面的项目中可能涉及到大量的表格操作&#xff0c;提前先封了 一个简单的操作方法&#xff0c;日后再加完善&…

Spring陷阱:事务测试被认为是有害的

Spring杀手级功能之一是容器内集成测试 。 尽管EJB多年来一直缺乏此功能&#xff08;Java EE 6终于解决了这个问题&#xff0c;但是我还没测试过&#xff09;&#xff0c;但是Spring从一开始就允许您从Web层开始&#xff0c;通过所有服务来测试整个堆栈。到数据库的方式。 数据…

python xlwt写入已有表_Python中,添加写入数据到已经存在的Excel文件

1.安装xlrd、xlwt、xlutilshttps://pypi.org/project/xlutils/pip安装&#xff1a;cmd下输入&#xff1a;pip install xlrd #读取exclepip install xlwt #写入exclepip install xlutils #操作 Excel 文件的实用工具&#xff0c;如复制、分割、筛选等2.代码主要部分实现import x…

java线程“生产/消费”模型2

/* 资源类 */ class ShareValue {private int total;//判断对象是否为空private boolean isEmptytrue;//判断对象是否已满private boolean isFulltrue;public ShareValue(int total) {this.total total;if(total>0) isEmptyfalse;if(total<1000) isFullfalse;}/** sync…

linux更改用户名_破旧安卓手机第二春,在安卓手机上使用Linux_deploy运行Linux

由于服务器位于国外&#xff0c;害怕被墙掉导致数据丢失&#xff0c;所以在本地写了脚本每小时从服务器上导出并下载到本地。但是电脑不可能二十四小时开机&#xff0c;所以很想买一个树莓派4玩玩。但是太贵辽&#xff0c;还好搜索到了Android运行Linux的方法&#xff0c;下面记…

关于Cocos2d-x中init方法和onEnter方法的区别

init()和onEnter()这两个方法都是写实例化对象的类(比如继承自Node的一些类等等)的时候用到的方法。 一般都是public类型下面的 bool init(); void onEnter(); 两个方法在实现的时候都要先执行父类方法&#xff0c;比如 Node::init(); Node::onEnter(); 注意&#xff1a; 1.ini…

在5分钟内在MacOSX Lion中设置JAVA_HOME,MAVEN_HOME,ANT_HOME

人们一直试图通过Mac上的Java开发世界来解决这个问题&#xff0c;这一直是我一直遇到的问题。 他们必须解决的第一件事就是设置适当的工具和环境。 幸运的是&#xff0c;足够多的MacOSX &#xff08;Lion或以前的版本&#xff09;仍然有许多重要的工具可用于Java开发&#xff0…