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+高并发+各大学习思维脑图+面试汇合