VisualVM(All-in-One Java Troubleshooting Tool)是性能最弱小的运行监督和故障处理程序之一,它集成了多种性能统计工具的性能,能够代替jstat,jmap,jstack,也能够代替JConsole的应用。VisualVM有一个很大的长处:不须要被监督的程序基于非凡的Agent去运行,因而它的通用性很强,对应用程序理论性能的影响也较小,使得它能够间接利用在生产环境中。

还有一大特点就是反对插件扩大,有了插件的扩大能力,就能够反对更多的性能,例如

  • 显示虚拟机过程以及过程的配置、环境信息(jps、jinfo)。
  • 监督应用程序的处理器、垃圾收集、堆、办法区以及线程的信息(jstat、jstack)。
  • dump以及剖析堆转储快照(jmap、jhat)。
  • 办法级的程序运行性能剖析,找出被调用最多、运行工夫最长的办法。
  • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建设一个快照,能够将快照发送开发者处进行Bug反馈。

关上并连贯

程序是在%JAVA_HOME%/bin的目录下,间接双击即可启动客户端,如下图

此监控工具默认的性能较少,咱们首先要装置一些插件,不便咱们监控应用,点击工具->插件关上插件的装置页面,并抉择本人须要的插件下载即可,如下

如果下载不了,请从新设置插件核心配置

依据本人的jdk版本在插件核心页面找到对应版本的地址,而后点击进入,最下面的Catalog URL就是须要的配置核心地址:visualvm.github.io/pluginscent…

[外链图片转存失败,源站可能有防盗链机制,倡议将图片保留下来间接上传(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管制

如下两个雷同的利用,一个是近程的连贯,一个是本地的连贯

利用概述

这个概述tab能够查看利用的根本信息,例如java版本,主类,jvm参数(启动参数),零碎属性等

监控信息

切换到监控tab 能够看到利用的CPU,堆,元空间,类加载以及线程数的总体变动状况。页面上还有两个按钮执行垃圾回收堆dump,操作按钮能够立刻执行full gc(下图堆大小缩小)和生存堆快照。

线程剖析

切换到线程tab能够看到利用中线程的信息,展示了线程的数量,右上角有个线程Dump的按钮,能够下载以后所有现场的堆栈信息(相当于jstack)。最上面还能够点击每个线程,展现每个线程的信息,如果存在死锁,会以红色字体给出提醒,如下图

点击线程Dump按钮,获取的堆栈信息,例如其中的死锁信息,能够间接看到产生死锁的具体位置

性能剖析

切换到抽样器tab 能够看到共有CPU和内存两个性能采样器,能够实时的监控对应利用的CPU和内存变动。CPU采样器能够将CPU占用工夫定位到具体方法,而内存采样器能够查看以后利用的堆信息,依据页面CPU内存的按钮抉择。

CPU采样

上面这个例子让程序占用CPU,看看监控上是什么样子

public class Test2 {    public static void main(String[] args) throws InterruptedException {        fullCpu();    }    private static void fullCpu() throws InterruptedException {        long startTime = 0;        while (true) {            startTime = System.currentTimeMillis();            while (System.currentTimeMillis() - startTime < 8) {            }            Thread.sleep(2);        }    }}

如下图Test2.fullCpu()办法占用了大量的CPU工夫,而其余办法就比拟闲暇。通过这个tab,咱们能够很疾速不便的定位到利用中最耗资源的办法并解决。(而线程CPU工夫,能够看到是依据CPU资源耗费大小对线程的排序)

内存采样

通过内存采样能够实时查看每个类内存占用状况,在利用运行的过程中,visual VM实时更新数据,动静的显示各个class内存占用的大小,同时还能够查看每个线程调配的内存大小。如下图

GC信息

切换到Visual GC的tab,能够看到堆的信息变动的图表,包含Metaspace,老年代,新生代的伊甸区,S0区和S1区的实时动态数据。

[外链图片转存失败,源站可能有防盗链机制,倡议将图片保留下来间接上传(img-bAxC8ied-1651827587196)(https://upload-images.jianshu...)]

Btrace动静跟踪

Btrace的作用是使在不停机的状况下,通过Hotspot虚拟机的Instrument性能动静的退出调试代码。能够跟踪指定的办法调用,构造函数以及零碎内存等信息,我感觉次要的意义在于当程序呈现问题时,排查谬误的一些必要信息时 (譬如办法参数、返回值等),在开发时并没有打印到日志之中以至于不得不停掉服务时,都能够通过调试增量来退出日志代码以解决问题。

能够说Btrace是检查和解决线上问题的大招,不必重启服务,通过脚本命令执行。

装置Btrace插件之后在对应的利用右键抉择 Trace Application 就会进入对应的操作面板,一个代码输出的管制页面。

这个举个例子:曾经上线的代码呈现空指针,然而对应间接看不出具体起因,须要输入一些额定信息辅助判断,或者须要在日志中输入一些额定信息。

线上代码如下

public class Test2 {    public static int add(int a, int b) {        return a + b;    }    public static void main(String[] args) throws InterruptedException {        while (true){            int a = (int) Math.round(Math.random() * 100);            int b = (int) Math.round(Math.random() * 100);            add(a,b);            Thread.sleep(2000);        }    }}

当初下面的代码曾经在线上运行了,然而我当初须要晓得a,b两个随机参数的具体值是什么,能够关上Btrace的代码界面,而后填充TracingScript即可,代码如下

/* BTrace Script Template */import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;@BTracepublic class TracingScript {  /* put your code here */@OnMethod(clazz="/.*Test2", // 监控以Test2结尾的类           method="add",           location=@Location(Kind.RETURN)) public static void func(int a,int b, @Return int result){   println("开始===============");   jstack();   println(strcat("办法参数A:",str(a)));   println(strcat("办法参数B:",str(b)));   println(strcat("办法后果:",str(result)));  }}
@OnMethod中参数的clazz须要管制的类,method是类中的办法,location中的Kind.RETURN是指办法完结后输入信息以及堆栈信息。想深刻理解这三种参数的具体应用办法请自行百度:“Btrace Java”

而后点击Start按钮就会开始执行,看到控制台输入的信息,如图

BTrace的用处很宽泛,打印调用堆栈、参数、返回值只是它最根底的应用模式。还能够实现的性能包含监控指定函数的耗时,获取任意行代码信息,脚本定时,获取类的属性等。

在官网上有应用BTrace进行性能监督、定位连贯透露、内存透露、解决多线程竞争问题等的应用案例,有趣味的读者能够去网上理解相干信息。

官网在此:github.com/btraceio/bt…

最全学习笔记大厂真题+微服务+MySQL+分布式+SSM框架+Java+Redis+数据结构与算法+网络+Linux+Spring全家桶+JVM+高并发+各大学习思维脑图+面试汇合