概述

Visual VM 是一个功能强大的多合一(多种功能)的故障诊断和性能检测的可视化工具。
它集成了多个jdk命令行工具,使用了Visual VM可用于显示虚拟机进程(jps)及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替了JConsole 。
在jdk 6 更新到7以后,Visual VM作为JDK的一部分发布(VisualVM在 JDK/bin目录下),Visual VM是完全免费的,可以完全替代jConsole,建议直接跳过JConsole,直接学习Visual VM ,毕竟这两个都是jdk自带的。

另外,Visual VM 也可以作为独立的软件直接从官网上下载并且安装。

jvisualvm和visual vm的区别:

visual vm是单独下载的工具,然后将visual vm结合到jdk中就变成了jvisualvm,仅仅是添加了一个j而已,这个j应该是java的用处,所以说jvisualvm其实就是visual vm

两种打开方式:

方式1. 在jdk安装目录中找到jvisualvm.exe,然后双击执行即可
方式2.打开DOS窗口,输入jvisualvm就可以打开该软件

插件的安装扩展

原生插件扩展

image.png

idea安装插件

image.png
首先在IDEA中搜索VisualVM Launcher插件并安装
image.png

2、重启IDEA,然后配置该插件
image.png

3、使用两种方式来运行程序

image.png

4、运行效果
还是打开jvisualvm界面,只是不需要我们手动打开jvisualvm而已

当然你不装idea插件,直接用jdk目录下的 visualvm 也是小事儿

连接方式

本地连接


监控本地Java进程的CPU、类、线程等

  1. /**
  2. * -Xms600m -Xmx600m -XX:SurvivorRatio=8
  3. * @author shkstart shkstart@126.com
  4. * @create 2020 21:12
  5. */
  6. public class OOMTest {
  7. public static void main(String[] args) {
  8. ArrayList<Picture> list = new ArrayList<>();
  9. while(true){
  10. try {
  11. Thread.sleep(5);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. list.add(new Picture(new Random().nextInt(100 * 50)));
  16. }
  17. }
  18. }
  19. class Picture{
  20. private byte[] pixels;
  21. public Picture(int length) {
  22. this.pixels = new byte[length];
  23. }
  24. }

启动上面的Java代码,然后你就会发现多了一个进程,这个进程就是你刚刚启动的main方法

image.png

远程连接


1-确定远程服务器的ip地址
2-添加JMX(通过JMX技术具体监控远程服务器哪个Java进程)
3-修改bin/catalina.sh文件,连接远程的tomcat
4-在…/conf中添加jmxremote.access和jmxremote.password文件
5-将服务器地址改成公网ip地址
6-设置阿里云安全策略和防火墙策略
7-启动tomcat,查看tomcat启动日志和端口监听
8-JMX中输入端口号、用户名、密码登录

主要功能

  1. import java.util.ArrayList;
  2. import java.util.Random;
  3. /**
  4. * -Xms600m -Xmx600m -XX:SurvivorRatio=8
  5. */
  6. public class HeapInstanceTest {
  7. byte[] buffer = new byte[new Random().nextInt(1024 * 100)];
  8. public static void main(String[] args) {
  9. try {
  10. Thread.sleep(1000);
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();
  15. while (true) {
  16. list.add(new HeapInstanceTest());
  17. try {
  18. Thread.sleep(10);
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. }

1.生成/读取堆内存快照

image.png

image.png

点 另存为 选个路径就能生成dump文件了.


读取dump文件:
image.png

image.png

image.png


如果发生了oom的情况,可以查看某个类的占用情况

image.png


还可以用这个dump文件和另外一个dump文件作比较

image.png

下面就是显示两个dump文件差异了, 负数就是减少的实例数

image.png

这个功能的使用场景是, 一个项目不同时期dump文件对比, 比如说你早晨九点生成一个dump文件,然后你十分钟之后又生成一个dump文件,这样你可以用这个对比功能来比较这10分钟内堆的情况

2.查看JVM参数和系统属性

JVM参数:

image.png

系统属性:
image.png

3.查看运行中的虚拟机进程

image.png

如果有死锁的话,会提示有死锁

4.生成/读取线程快照

image.png

image.png

生成线程的dump文件

image.png

image.png


读取线程快照文件

image.png
image.png

5.程序资源的实时监控

image.png

CPU分析

  1. 如果我们发现生产环境的服务器性能变慢,cpu的运转的占用率也很高,我们就可以通过cpu分析来看一看到底是什么原因造成的. 比如说看看是不是方法里面写了一些阻塞式的方法或者是造成了一些死锁啥的.

image.png

image.png

cpu采样器能够定位占用时间的一些方法 ,这样就可以把占用cpu时间比较长的方法监控到,


方法占用了多少时间

image.png


image.png

过滤指定包下面的类调用的时间.


生成CPU分析快照
image.png

内存分析

当前进程中哪些结构的相关实例数量 字节数占用等等.
当出现oom 或者full gc比较多的时候就可以通过内存分析看一下了,
可以定位具体的线程下占用的数据比较多了

image.png


每个线程分配

image.png

6.其他功能

JMX代理连接
远程环境监控
CPU分析和内存分析