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

JVM虚拟机专题图形化监控工具-VisualVM

时间:2023-04-01 15:08:32 Java

VisualVM(All-in-OneJavaTroubleshootingTool)是最强大的运行监控和故障处理程序之一,它集成了各种性能统计工具的功能,可以替代jstat、jmap、jstack,也可以代替JConsole使用。VisualVM有一个很大的优势:不需要被监控的程序基于专门的Agent运行,因此通用性强,对应用的实际性能影响小,可以直接应用于生产环境。另一个主要特点是它支持插件扩展。借助插件的扩展能力,可以支持更多功能,如显示虚拟机进程、进程配置、环境信息(jps、jinfo)等。监控应用程序的处理器、垃圾回收、堆、方法区和线程信息(jstat、jstack)。转储和分析堆转储快照(jmap、jhat)。方法级程序运行性能分析,找出调用次数最多,运行时间最长的方法。离线程序快照:收集程序运行时配置、线程转储、内存转储等信息创建快照,可发送给开发者反馈bug。打开并连接%JAVA_HOME%/bin目录下的程序,双击直接启动客户端,如下图,这个监控工具默认功能比较少,我们首先需要安装一些插件方便我们监控和使用,点击工具->插件打开插件安装页面,选择您需要下载的插件。如果无法按如下方式下载,请重新设置插件中心配置。根据自己的jdk版本在插件中心页面找到对应版本的地址,然后点击进入。topTheCatalogURL为所需配置中心地址:visualvm.github.io/plugincent...【转外链图片失败,源站可能有防盗链机制,建议保存图片直接上传(img-fS7KMpKZ-1651827587183)(https://upload-images.jianshu...)]【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-Up6L9n0i-1651827587184)(https://upload-images.jianshu...)]和Jconsole一样,有两种连接方式,一种是本地连接,一种是远程连接本地连接:在控制台中可以看到本地出现的Java程序,直接双击或者右键就可以远程打开连接:右键选择JMX连接,输入连接信息IP:端口点击确定(一个jmx图标将出现在本地节点下)。前提是Java程序在启动时加入了如下参数-Djava.rmi.server.hostname=127.0.0.1//远程服务器的IP(本地可访问)-Dcom.sun.management.imxremote-Dcom.sun.management.jmxremote.port=5555//远程服务器的端口(随机选择一个,用于JMX管理进程)-Dcom.sun.management.jmxremote.authenticate=false//是否认证(如果为true,需要配置密码,自己百度)-Dcom.sun.management.jmxremote.ssl=false//ssl控制下面两个相同的应用,一个是Remote连接,一个是本地连接Applicationoverview这个overview选项卡可以查看基本的应用的信息,比如java版本,主类,jvm参数(启动参数),系统属性等监控信息切换到监控标签可以看到应用的CPU,heap,元空间上还有两个按钮,类加载,以及执行垃圾收集和堆转储的线程数的整体变化。操作按钮可以立即执行fullgc(下图中的heapsizereduction)和liveheapsnapshots。线程分析切换到线程选项卡可以看到应用程序中的线程信息,显示线程数。右上角有个threaddump按钮,可以下载当前所有站点的stack信息(相当于jstack)。在底部,您还可以点击每个线程以显示每个线程的信息。如果出现死锁,会给出红色字体的提示,如下图。点击threadDump按钮,获取堆栈信息,比如死锁信息,可以直接看到死锁发生的具体位置的性能分析。切换到采样器选项卡,可以看到有CPU和内存两个性能采样器,可以实时监控对应应用的CPU和内存的变化。CPU采样器可以将CPU使用时间定位到具体方法,而内存采样器可以查看当前应用的堆信息,根据页面上CPU和内存的按钮进行选择。CPU采样下面的例子让程序占用CPU,看看在monitor上是什么样子的}privatestaticvoidfullCpu()throwsInterruptedException{longstartTime=0;while(true){startTime=System.currentTimeMillis();while(System.currentTimeMillis()-startTime<8){}Thread.sleep(2);}}}如下图的方法Test2.fullCpu()占用了大量的CPU时间,而其他方法则比较空闲。通过这个选项卡,我们可以快速方便的定位到应用中最耗资源的方法并解决。(关于线程CPU时间,可以看到线程是按照CPU资源消耗排序的。)内存采样通过内存采样,可以实时查看各个类的内存使用情况。应用运行过程中,可视化VM实时更新数据,动态显示各个类占用内存大小,还可以查看各个线程分配的内存大小。如下图,切换到VisualGC选项卡查看GC信息,可以看到堆信息变化图,包括Metaspace、老年代、新生代Eden区、S0区的实时动态数据和S1区。【外链图片传输失败,源站可能有防盗链接机制,建议保存图片直接上传(img-bAxC8ied-1651827587196)(https://upload-images.jianshu...)]Btrace动态跟踪Btrace的作用是在不停机的情况下,通过Hotspot虚拟机的Instrument函数动态添加调试代码。它可以跟踪指定的方法调用、构造函数和系统内存等信息。我觉得主要的意义在于,当程序出现问题时,在排查一些必要的信息(如方法参数、返回值等)时,开发时不打印。当进入日志不得不停止服务时,可以通过调试增量添加日志代码来解决问题。可以说,Btrace是一个很好的检查和解决在线问题的工具。不需要重启服务,通过脚本命令执行。安装好Btrace插件后,在对应的应用上右击选择TraceApplication,进入对应的操作面板,一个代码输入的控制页面。以此为例:已经启动的代码中出现了空指针,但是无法直接看出具体原因,需要输出一些额外的信息来辅助判断,或者需要输出一些额外的信息在日志。线上代码如下publicclassTest2{publicstaticintadd(inta,intb){returna+b;}publicstaticvoidmain(String[]args)throwsInterruptedException{while(true){inta=(int)Math.round(Math.random()*100);intb=(int)Math.round(Math.random()*100);添加(a,b);线程.睡眠(2000);}}}现在上面的代码已经在线运行了,但是现在我需要知道这两个随机参数a和b的具体取值是多少。我可以打开Btrace的代码界面,填写TracingScript。代码如下OnMethod(clazz="/.*Test2",//监听以Test2结尾的类method="add",location=@Location(Kind.RETURN))publicstaticvoidfunc(inta,intb,@Returnintresult){println("开始================");堆栈();println(strcat("方法参数A:",str(a)));println(strcat("方法参数B:",str(b)));ntln(strcat("方法结果:",str(result)));}}@OnMethod@OnMethod中参数的clazz需要控制类,method是类中的方法,location中的Kind.RETURN是指方法结束后的输出信息和栈信息如果想了解更多关于这三个参数的具体使用请百度:“BtraceJava”然后点击开始按钮开始执行,看控制台输出的信息,如图BTrace用途广泛,打印调用栈、参数、返回值只是它最基本的使用形式。还可以实现的功能包括监控指定函数的耗时,获取任意一行代码的信息,定时脚本,获取类的属性等,官网上有使用BTrace进行性能测试的用例监控,定位连接泄漏,内存泄漏,解决多线程竞争问题。有兴趣的读者可以上网了解相关资料。官网在这里:github.com/btraceio/bt...最全的学习笔记大厂真题+微服务+MySQL+分布式+SSM框架+Java+Redis+数据结构与算法+网络+Linux+Spring全家桶+JVM+高并发+各大学习思维导图合集+面试