2016年,我花了一些时间整理了一些关于jvm的介绍文章。到现在,还有一些内容没有完全补充,包括如何使用工具来监控调优前后的性能变化。该工具作为图形界面使用,更直观地展示问题。另一方面,一些性能密集型分析(转储文件分析)一般不会在生产中直接分析。往往dump出来的文件在1G左右,人工分析效率比较低。low,所以用工具分析jvm相关的问题,往往能起到事半功倍的效果。jvm监控分析工具一般分为两类,一类是jdk自带的工具,一类是第三方分析工具。jdk自带的工具一般都在jdk的bin目录下,以exe的形式直接点击使用。附带的分析工具非常强大,几乎涉及方方面面,但我们只用到最常用的两个:jconsole.exe和jvisualvm。EXE文件;第三方分析工具很多,各有侧重,比较有代表性的有:MAT(MemoryAnalyzerTool)、GChisto等。对于大型JAVA应用,测试再详细也很难塞所有的漏洞。即使我们在测试阶段做了很多有效的工作,很多问题在生产环境中还是会暴露出来,很难在测试环境中解决。重现。JVM可以记录系统出现问题时的部分运行状态,并保存在堆转储(HeapDump)文件中,为我们分析诊断问题提供了重要依据。其中VisualVM和MAT是dump文件的分析工具。jdk自带的工具jconsoleJconsole(JavaMonitoringandManagementConsole)是java5.0开始JDK自带的java监控管理控制台。它用于监控JVM中的内存、线程和类。它是一个基于JMX(java管理扩展)的GUI性能监控工具。jconsole利用jvm的扩展机制获取并显示虚拟机中运行的应用程序的性能、资源消耗等信息。直接在jdk/bin目录下点击jconsole.exe启动,界面如下:在弹出的框中可以选择本机的java应用程序进行监控,也可以选择远程java服务进行监控,如果需要监控远程服务,在tomcat启动脚本中加入如下代码:-Dcom.sun.management.jmxremote.port=6969-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management。jmxremote.authenticate=false连接进去后,会看到jconsole概览和主要功能:概览,内存,线程,类,VM,MBean概览,一个折线图显示堆内存使用,活跃线程数,加载的类,和CPU使用率图表,你可以清楚地观察到程序执行过程中的变化。内存,主要显示内存的使用情况。同时可以查看堆内存和非堆内存的变化值对比。也可以点击ExecuteGC来惩罚GC的执行线程。线程可以查看线程的详细信息,比如线程的状态是什么,栈的内容等等。同时也可以点击“DetectDeadlock”来检查线程之间是否存在死锁。类,主要显示加载类的相关信息。VM概览,显示所有JVM信息的概览,包括基本信息、线程相关、堆相关、操作系统、VM参数等Mbean,查看Mbean属性、方法等VisualVM简介VisualVM是一个工具,提供一个可视化界面,用于查看运行在Java虚拟机(JavaVirtualMachine,JVM)上的基于Java技术的应用程序(Javaapplications)的详细信息。VisualVM组织由Java开发工具包(JDK)工具检索到的JVM软件相关数据,并以一种允许您快速查看有关多个Java应用程序的数据的方式呈现此信息。您可以查看有关本地应用程序以及在远程主机上运行的应用程序的数据。此外,可以捕获有关JVM软件实例的数据并将其保存到本地系统以供以后查看或与其他用户共享。VisualVM是javajdk自带的最强大的调优工具。也是我最常使用的调优工具,几乎涉及到jvm调优的方方面面。也可以双击jdk/bin目录下的jvisualvm.exe使用。启动后也可以像jconsole一样选择local和remote。如果需要远程监控,还需要配置相关参数。主界面如下;VisualVM可以根据不同的需要安装。插件,每个插件都有不同的侧重点,有的主要监控GC,有的主要监控内存,有的监控线程等。如何安装:1.从主菜单中选择“工具”>“插件”。2.在“可用插件”选项卡中,选中插件的“安装”复选框。单击安装。3.逐步完成插件安装过程。这里我以Eclipse(pid22296)为例。双击后直接展开。主界面显示系统和jvm。点击右下角的jvm参数和系统属性可以查看详细的参数信息。因为VisualVM的插件太多,这里主要介绍三个我主要用到的几个:监控,线程,VisualGC。监控的主页面其实就是cpu、内存、类、线程的图。threading和jconsole函数之间没有太大区别。VisualGC是经常使用的一种。函数,可以清楚的看到年轻代和老年代的内存变化,以及gc频率和gc时间。其实jconsole几乎都有以上的功能。VisualVM更全面、更直观。此外,VisualVM还有很多其他的功能,比如分析dumped内存快照,分析dumped线程快照等等,还有很多其他的插件你可以去探索。什么是第三方调优工具MATMAT?MAT(MemoryAnalyzerTool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java堆分析工具,可以帮助我们发现内存泄漏,降低内存消耗。使用内存分析工具从众多的对象中进行分析,快速计算出对象在内存中的大小,看看是谁在阻止垃圾回收器回收,并且可以通过报表对象直观的查看可能的结果。通常,内存泄漏分析被认为是一项非常困难的工作,通常由团队中的高级人员来执行。不过要介绍的MAT(EclipseMemoryAnalyzer)算是一款“傻瓜式”的heapdump文件分析工具,只需要轻点鼠标,就可以生成专业的分析报告。与其他内存泄漏分析工具相比,MAT非常简单易用,基本可以一键上手,即使是新手也能快速上手。MAT以eclipse插件的形式安装。具体的安装过程这里不再赘述。可以使用visualvm或jmap命令生成heap文件导入eclipsemat中生成分析报告:在生成该报告的同时也会生成dump文件。分析结果的三个html文件(dump_Top_Consumers.zip、dump_Leak_Suspects.zip、dump_Top_Components.zip)生成在super目录下,方便发送给相关同事查看。需要注意的是以下Actions、Reports和StepbyStep区域:Histogram:列出内存中的对象,对象的数量和大小,支持正则表达式搜索,也可以计算该类型DominatorTree的所有对象的保留大小:列出最近的对象及其依赖的存活对象(大小按RetainedHeap排序)TopConsumers:通过图形列出最近的对象。重复类:检测由多个类加载器加载的类LeakSuspects:内存泄漏分析TopComponents:列出大于总堆1%的报告。ComponentReport:分析对象属于同一个包或被同一个类加载器加载。以上只是初步介绍。Mat还有更强大的用途,比如比较堆内存。在生产环境中,经常每隔几分钟就用它来定位问题。dump内存快照,然后对比不同时刻堆内存的变化,找出问题所在。GChistoGChisto是一款专业分析gc日志的工具。可以通过gc日志分析:MinorGC、fullgc时间、频率等,并以列表、报表、图表等不同形式反映gc情况。虽然界面有点粗糙,但是功能还是不错的。配置本地jdk环境后,双击GChisto.jar,在弹出的输入框中点击add,选择gc.loglogGCPauseStats:可以查看GC次数,GC时间,GC开销,***GCtime和MinimumGCtime等,以及对应的直方图GCPauseDistribution:查看GC暂停的详细分布,x轴表示垃圾回收暂停时间,y轴表示暂停次数。GCTimeline:在整个时间线上显示垃圾回收。不过这个工具已经不再维护了,无法识别***jdk日志文件。gcviewerGCViewer也是一个小型分析工具,用于可视化查看Sun/Oracle、IBM、HP和BEAJava虚拟机产生的垃圾收集器的日志。个人感觉gcviewer显示的界面比GChisto更乱,后者更专业。GCEasy是一个在线使用非常方便的网络工具。地址:http://gceasy.io进入官网,上传打包后的zip或gz后缀压缩包,稍等片刻即可得到分析结果。推荐使用该工具进行gc分析。【本文为专栏作家《纯洁的微笑》原创稿件,转载请微信♂联系作者获得授权】点此查看该作者更多好文
