VisualVM有四个区域

1.内存堆,堆就是放对象的,我们可以点堆Dump,通过分析ump结果,看有哪些对象是非常占内存的。

遇到内存问题,最好是希望能够直观的看到Java程序堆中现在有哪些对象,有哪些对象数目一直在递增而没有被回收。为此需要借助工具来排查了,visualVM是非常好的能满足需求的一个工具。

点击Classes, 发现char[]所占用的内存是最大的

双击它,得到如下Instances结果,Instances是按Size由大到小排列的,第一个就是最大的, 展开Field区域的 values

通过查看堆内存,我们可以得到哪些是大对象

我们再安装个Visual GC插件(visualVM-工具-插件-可用插件)就可以分析查看内存的GC情况

下面转自https://blog.csdn.net/kl28978113/article/details/53817827

准备模拟内存泄漏demo

1、定义静态变量HashMap

2、分段循环创建对象,并加入HashMap

import java.util.HashMap;
import java.util.Map;
public class CyclicDependencies {//声明缓存对象private static final Map map = new HashMap();public static void main(String args[]){try {Thread.sleep(10000);//给打开visualvm时间} catch (InterruptedException e) {e.printStackTrace();}//循环添加对象到缓存for(int i=0; i<1000000;i++){TestMemory t = new TestMemory();map.put("key"+i,t);}System.out.println("first");//为dump出堆提供时间try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}for(int i=0; i<1000000;i++){TestMemory t = new TestMemory();map.put("key"+i,t);}System.out.println("second");try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}for(int i=0; i<3000000;i++){TestMemory t = new TestMemory();map.put("key"+i,t);}System.out.println("third");try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}for(int i=0; i<4000000;i++){TestMemory t = new TestMemory();map.put("key"+i,t);}System.out.println("forth");try {Thread.sleep(Integer.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("qqqq");}
}

配置JVM参数:-Xms512m -Xmx512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=50m

1.查看Visual GC标签,内容如下,这是输出first的截图

2.这是输出forth的截图:

通过2张图对比发现:

老生代一直在gc,当程序继续运行可以发现老生代gc还在继续:

增加到了7次,但是老生代的内存并没有减少。说明存在无法被回收的对象,可能是内存泄漏了。

如何分析是那个对象泄漏了呢?打开抽样器标签:点击后如下图:

按照程序输出进行堆dump,当输出second时,dump一次,当输出forth时dump一次。

进入最后dump出来的堆标签,点击类:

比较结果如下:

可以看出在两次间隔时间内TestMemory对象实例一直在增加并且多了,说明该对象引用的方法可能存在内存泄漏。

如何查看对象引用关系呢?

右键选择类TestMemory,选择“在实例视图中显示”,如下所示:

左侧是创建的实例总数,右侧上部为该实例的结构,下面为引用说明,从图中可以看出在类CyclicDependencies里面被引用了,并且被HashMap引用。

如此可以确定泄漏的位置,进而根据实际情况进行分析解决。

因为在上面这个例子中,我们是一直往Map里加对象的,没有执行remove对象操作,也没有释放Map,所以通过visualVM可以看到堆占用的内存是很高的,当我执行remove对象操作或把map设为空时, 可以很直观的看到堆内存在GC时,一下子回收了很多对象

2.CPU

CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。

过高的 CPU 使用率可能是由于我们的项目中存在低效的代码;

在我们对程序施压的时候,过低的 CPU 使用率也有可能是程序的问题。

使用抽样器分析CPU

可以看到是具体方法占用CPU的时间数据,方便我们定位到,效率低的方法

3.线程

当我们对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。

在 VisualVM 的监视标签内,我们可以查看当前应用程序中所有活动线程(Live threads)和守护线程(Daemon threads)的数量等实时信息。

来一段死锁的程序,看VisualVM 能否分析出来

package jvisualVM;public class DeadLock {public static void main(String[] args) {Resource r1 = new Resource();Resource r0 = new Resource();Thread myTh1 = new LockThread1(r1, r0);Thread myTh0 = new LockThread0(r1, r0);myTh1.setName("DeadLock-1 ");myTh0.setName("DeadLock-0 ");myTh1.start();myTh0.start();}
}class Resource {private int i;public int getI() {return i;}public void setI(int i) {this.i = i;}}class LockThread1 extends Thread {private Resource r1, r2;public LockThread1(Resource r1, Resource r2) {this.r1 = r1;this.r2 = r2;}@Overridepublic void run() {int j = 0;while (true) {synchronized (r1) {System.out.println("The first thread got r1's lock " + j);synchronized (r2) {System.out.println("The first thread got r2's lock  " + j);}}j++;}}}class LockThread0 extends Thread {private Resource r1, r2;public LockThread0(Resource r1, Resource r2) {this.r1 = r1;this.r2 = r2;}@Overridepublic void run() {int j = 0;while (true) {synchronized (r2) {System.out.println("The second thread got r2's lock  " + j);synchronized (r1) {System.out.println("The second thread got r1's lock" + j);}}j++;}}}

打开VisualVM检测到的JVM进程,我们可以看到这个tab在闪,VisualVM已经检测到我这个package下面的DeadLock类出错了

切换到Thread tab, 可以看到死锁了, Deadlock detected!

另外可以点击Thread Dump 线程转储,进一步分析,在这里就不赘述了,有兴趣的读者可以自行实验。

VisualVm的理解相关推荐

  1. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  2. 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析

    Java虚拟机深入理解系列全部文章更新中- 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别J ...

  3. 深入理解 Java 虚拟机-如何利用 VisualVM 对高并发项目进行性能分析

    来自:好好学java 前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择Visua ...

  4. 深入理解JAVA虚拟机学习笔记11——JDK可视化工具-VisualVM以及案例分析

    VisualVM:多合一故障处理工具,功能比较全面的一个工具,与其它的检测工具相比,对实际性能影响很小,并且还具备安装插件功能.这个工具和前面介绍的JConsole工具有很多类似的功能,但是比JCon ...

  5. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  6. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...

    虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机-如何利用 Visual ...

  7. 深入理解 Java 虚拟机 - 你了解 GC 算法原理吗

    来自:好好学Java 虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机- ...

  8. 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析

    来自:好好学java 话不多说,今天就分析一下一些常用的Java虚拟机的参数设置,以及如何更好的使用! 1 JVM参数简介 首先想说的是其实这些参数我们并不是陌生的,在平时的开发和使用中经常都会遇到, ...

  9. 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析

    来自:好好学java 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够 ...

最新文章

  1. python语言介绍-Python语言简介
  2. 3 命名空间与命名规范
  3. 了解一下Cookie吧
  4. 锐捷RG-S2126G交换机密码恢复实战
  5. 027_JavaScript数组迭代
  6. .DLL文件是什么?
  7. 武鸣高中2021高考成绩查询,2019年广西两大重点高中成绩大比拼
  8. 如何远程比较两个系统里同一个ABAP类方法代码的差异
  9. 私活利器,docker快速部署node.js应用
  10. 知名教授:科研与饭碗
  11. linux下命令集合
  12. java数据成员_Java基础教程之对象的方法与数据成员
  13. 哈希表查找失败的平均查找长度_面试官:哈希表都不知道,你是怎么看懂HashMap的?...
  14. c语言找不到exe文件,这个程序怎么运行?为什么显示没有exe??
  15. JAVA将多个Pdf合并成一个Pdf
  16. HAU寒假训练第二周
  17. 蓝牙软件测试指标,蓝牙测试简介
  18. VMware Workstation中部署VMware vSphere 7.0
  19. 游戏人工智能——聚集与避障
  20. 网警如何查虚拟服务器,网警查高防云服务器

热门文章

  1. 深度学习中的tf.nn.softmax(logits, axis=1)以及tf.argmax(prob, axis=1)两个函数的参数以及用法
  2. 内存耗用:VSS/RSS/PSS/USS 的介绍
  3. Linux 集群技术
  4. java抽奖_JAVA实现用户抽奖功能(附完整代码)
  5. mysql usleep_date、sleep和usleep命令
  6. 计算机中浮点数的表示,浮点数在计算机中的表示
  7. 论文研读笔记(一)——ALEXnet
  8. 遥感影像的几何校正介绍
  9. 海贼王热血航线正在连接服务器,《航海王热血航线》登录异常解决方法 无法进入怎么解决...
  10. myeclipse加大内存