当前位置: 首页 > 后端技术 > Java

这个Java性能调优工具真的很强大!

时间:2023-04-02 02:12:23 Java

作者:赵玉仪清晨来源:www.cnblogs.com/xifengxiaoma/p/9402497.htmlJVisualVM简介VisualVM是Netbeans的profile子项目,已经包含在JDK6.0update7中,可以监控线程和内存在这种情况下,检查方法的CPU时间和内存中的对象。对于已经GC过的对象,反向查看分配的栈(比如哪些对象分配了100个String对象)。在JDK_HOME/bin(默认是C:\ProgramFiles\Java\jdk1.6.0_13\bin)目录下,有一个jvisualvm.exe文件,双击打开,从UI上看,这个软件开发基于NetBeans。VisualVM提供了一个可视化界面,用于查看在Java虚拟机(JVM)上运行的基于Java技术的应用程序的详细信息。VisualVM组织由Java开发工具包(JDK)工具检索到的JVM软件相关数据,并以一种允许您快速查看有关多个Java应用程序的数据的方式呈现此信息。您可以查看有关本地应用程序或在远程主机上运行的应用程序的数据。此外,可以捕获有关JVM软件实例的数据并将其保存到本地系统以供以后查看或与其他用户共享。双击启动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线程快照等等,还有很多其他的插件你可以去探索。准备模拟内存泄漏示例1、定义静态变量HashMap2,分段循环创建对象,添加HashMap代码如下:importjava.util.HashMap;导入java.util.Map;publicclassCyclicDependencies{//声明缓存对象privatestaticfinalMapmap=newHashMap();publicstaticvoidmain(Stringargs[]){try{Thread.sleep(10000);//时间打开visualvm}catch(InterruptedExceptione){e.printStackTrace();}//循环添加对象到缓存for(inti=0;i<1000000;i++){TestMemoryt=newTestMemory();map.put("键"+i,t);}System.out.println("第一个");//提供从堆中转储的时间try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<1000000;i++){TestMemoryt=newTestMemory();map.put("键"+i,t);}System.out.println("second");try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<3000000;i++){TestMemoryt=newTestMemory();地图.put("key"+i,t);}System.out.println("third");try{Thread.sleep(10000);}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<4000000;i++){TestMemoryt=newTestMemory();map.put("key"+i,t);}System.out.println("forth");try{Thread.sleep(Integer.MAX_VALUE);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("qqqq");}}3.配置jvm参数如下:-Xms512m-Xmx512m-XX:-UseGCOverheadLimit-XX:MaxPermSize=50m4,运行程序,登录visualvm进行监控,使用JVisualVM分析内存泄漏1.查看VisualGC选项卡,内容如下,这是先输出的截图,这是forth的输出截图:通过两张图的对比,发现oldgeneration一直在gc,当程序继续运行时,可以发现oldgeneration还在继续gc:增加到7倍了,但是老年代的内存并没有减少,说明有对象无法回收,可能是内存泄漏。如何分析是哪个对象漏水了?打开sampler选项卡:点击它,如下图:根据程序输出进行一次heapdump,第二次输出时dump一次,第四次输出时dump一次。进入上次dump的heap选项卡,点击class:点击右上角:“Comparewithanotherheapstorage”。如图,选择第一次导出的dump内容进行对比:对比结果如下:可以看出TestMemory对象实例的数量一直在增加,并且在两个区间内都比较多,说明对象引用的方法可能存在内存泄漏。如何查看对象引用关系?右键选择类TestMemory,选择“在实例视图中显示”,如下图:左边是创建的实例总数,右边上半部分是实例的结构,下面是参考说明。从图中可以看出,它在类CyclicDependencies中被引用,被HashMap引用。这样就可以确定泄漏的位置,然后根据实际情况分析解决。JVisualVM远程监控Tomcat1,修改远程tomcat的catalina.sh配置文件,增加:-JAVA_OPTS="$JAVA_OPTS-Djava.rmi.server.hostname=192.168.122.128-Dcom.sun.management.jmxremote.port=18999-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false"该配置不先进行权限验证。只需打开jmx端口即可。打开jvisualvm,右键remote,选择AddRemoteHost:输入主机名,ip直接写,如下:右键新建的host,选择AddJMXConnection,输入tomcat中配置的端口.双击打开。完全的!近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.终于通过开源项目拿到了IntelliJIDEA激活码,太贴心了!3、阿里Mock工具正式开源,秒杀市面上所有Mock工具!4、SpringCloud2020.0.0正式发布,全新颠覆版本!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!