VisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样,预示着它除了运行监视、故障处理外,还提供了很多其他方面的功能。如性能分析Profiling),VisualVM的性能分析功能甚至比起JProfiler、YourKit等专业且收费的Profiling工具都不会逊色多少,而且VisualVM的还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。这个优点是JProfiler、YourKit等工具无法与之媲美的。如图所示:
VisualVM能做到什么?VisualVM可以做到:
1、显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
2、监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
3、dump以及分析堆转储快照(jmap、jhat)。
4、方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
5、离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
进入bin目录下,找到jvisualvm.exe执行,界面是不是比我们的JConsole高了几个档次?在最左边会列出所有的当前在本机的所有的程序,同样也可以进行远程连接,但是一样要配置开始说过的参数。
VisualVM它支持插件,点开工具--》插件,设置里面有我们的插件中心的地址是Github上的一个地址,我们可以打开这个网址看下,插件下载的时候得根据你的JDK版本来进行下载,下图这里安装了三个插件,所以我们的线程会出现可视化界面,出现了Visual GC页签,以及出现了Tracer页签。如图所示:
-
概述页签
和JConsole差不多,很多显示的东西都是重合的JVM参数和我们用jps输出的是一样的,系统属性和我们用命令jinfo -sysprops看到的是一样的。如图所示:
2、监视
和我们的JConsole界面显示的很类似对吧。堆的大小、元数据空间的大小等等。堆dump就是可以导出我们当前线程的堆转储文件,其实就相当于我们jdk的命令行中执行jmap的命令。如图所示:
3、线程
同样也有Dump,同样是和我们JDK命令行工具的jstack是一样的操作。可以生成虚拟机当前时刻的线程快照。如图所示:
4、抽样器
这是用来分析当前这个进程所执行的方法,哪个方法所执行的时间最多。哪一个线程所占用的时间最多,这对我们的线程调优有很大的帮助,我们可以知道我们所写的代码在哪一个方法或者说是哪一个线程所耗费的CPU时间最长。为什么需要那么多?是我们的业务要求?还是我们代码有无限循环?我们也可以来监控内存,我们当前进程中哪一个类占据的字节最多,会按照从大到小的顺序进行排序。同样我们也可以来查看当前进程中哪一个线程所占用的空间最多。我们可以根据类的占用内存大小以及线程占用内存的大小来进行我们的调优。如图所示:
5、Visual GC
Visual GC可以看到我们这个进程(例如IDEA的进程)从运行以来整个的GC概况。以图形化的方式来显示元数据空间、老年代、Eden区、两个Survivor区,Compile Time代表的是你的即时编译花了多久时间,Class loader代表类加载、卸载花了多少时间。GC花了多少时间,一共发生了多少次GC,从我们的进程开始到现在为止总共发生了多少次GC。Eden区发生了多少次GC,花了多少时间,Eden Space表示Eden区的总共大小以及占用了多少空间。Old Gen老年代的指标和新生代类似也是多大空间,使用了多少,发生多少次GC。如图所示:
6、实时堆转储快照文件分析
我们可以在监视器里面点击堆dump的按钮,然后生成实时的堆转储文件,实时分析我们实时的堆转储文件,我们可以查案显示系统属性,显示堆栈上的线程,假如我们要看类,我们可以当前虚拟机进程中所有的类,假如我们要看String这个类,我们可以右键点击查看该类在实例类图中显示。我们可以看到每个类有哪些具体内容。
有些同学如果用idea来安装Visual VM有可能会失败,那是因为我们idea会自带OpenJDK,还有有些区别的。
在我们的Eclipse上也有个工具叫MAT,是我们Eclipse的插件,开源的,主要用来分析内存溢出和堆使用情况的,但是我们现在绝大多数人用的idea了所以在这里就不演示了。