文章目录

  • 一、前言
  • 二、JAVA监视与管理控制台
  • 三、拓展阅读

一、前言

经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博文就根据已有的理论知识,通过可视化工具来实战一番。

二、JAVA监视与管理控制台

今天要讲解的工具位于JDK/bin目录下,大家可以发现该目录下有很多可执行文件,这里都是JDK为我们提供用于分析内存的一些工具。我们重点看看jconsole.exe-JAVA监视与管理控制台

先运行以下程序:

public class Test {private static List<Test> list = new ArrayList<Test>();public static void main(String[] args) throws InterruptedException {for(int i=0; i<1000; i++) {Test test = new Test();list.add(test);Thread.sleep(50);}}
}

再双击运行可视化工具,这里会让你选择要监控的程序,我们选择刚刚运行的程序。如下图:

该页面只是一个概览页面,我们可以点进去上方导航栏的内存页,进去后我们可查看内存中各部分的使用情况图表,这里我们选择Eden区的查看。

可看到内存使用呈锯齿波状态,因为我们在循环中不断的产生新对象,而新对象又在Eden区中创建,所以内存使用会不断增加,当达到所设定的最大值后就会进行内存的回收,由于每个新生的对象都被存入到了List中,因此都不属于垃圾对象(因为处于关系网中),所以就要复制到另一个Survivor中,如果另一个Survivor区也满了,就会复制到年老区了。可查看上图右下角绿色图,在运行中会动态更新的,变化情况和刚刚说的是一样的。

当我们使用多线程的时候,会经常出现程序一直运行不会停止的情况,有可能出现死锁,有可能出现了死循环,可以通过该工具检测出来,先运行以下程序:

public class Test {public static void main(String[] args) throws InterruptedException {new Thread(new Runnable(){@Overridepublic void run() {while(true){}}}).start();}
}

再点击导航栏上的线程进入线程查看页:

进入后页面长这个样子,看下方红色标记部分,根据我们刚刚执行的代码来看,代码开启了一个线程,作用就是执行死循环,线程的名字为默认的“Thread-0”。因为有了死循环,所以程序无法正常退出,查看堆栈跟踪,发现程序停在Test类的第14行,查看代码可发现那里是个死循环。注意:这里只是个测试例子,因此线程的名字用的是默认的,在实际环境中应为每个线程命名,在跟踪调试的过程中会大大减少工作量。

接下来我们来测试死锁的情况,运行以下代码:

public class Test {private static Object obj1 = new Object();private static Object obj2 = new Object();public static void main(String[] args) throws InterruptedException {for(int i=0; i<1000; i++) { // 循环100次,增加死锁的概率new Thread(new Runnable() {@Overridepublic void run() {synchronized(obj1){ // 先申请obj1synchronized(obj2){ // 再申请obj2System.out.println("我是线程1");}}}}).start(); //启动线程1new Thread(new Runnable() {@Overridepublic void run() {synchronized(obj2){ // 先申请obj2synchronized(obj1){ // 再申请obj1System.out.println("我是线程2");}}}}).start(); //启动线程2}}
}

代码中线程1先申请obj1,再申请obj2;线程2先申请obj2,再申请obj1。如果执行次数多了就会出现死锁,我们依然来看线程的监控台:

可以看出来,这么多的线程都处于等待中,不能正常退出,我们随机点一个查看,可以看到他的状态是BLOCKED。他需要的锁被线程31所持有。我们再看看31的线程,可以看到他需要的锁被线程30所持有。那么我们再看看30的线程,可以发现,30线程所需要的锁被31号线程所持有。他们互相等待,互相不释放,最终导致死锁,也导致后面那么多的线程处于BLOCKED状态。

这个可视化的工具我们就先讲这么多吧。从内存到线程,是我们在实际环境中不管是优化还是编码都会经常遇到的问题。

三、拓展阅读

  • 《JVM专栏》

JVM进阶(十二):JAVA 可视化分析工具实战相关推荐

  1. JVM进阶(十二)——JAVA 可视化分析工具

    JVM进阶(十二)--JAVA 可视化分析工具   经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工具来实践一番. ...

  2. (十三)JAVA 可视化分析工具

    我们今天要讲解的工具位于JDK目录的bin目录下,大家可以发现该目录下有很多可执行文件,这里都是JDK为我们提供用于分析内存的一些工具.我们重点看看jconsole.exe,JAVA监视与管理控制台. ...

  3. jhat命令的html页面,jvm 指令工具 jhat 命令(Java堆分析工具)

    jhat 简介 jhat 全称:Java Heap Analyse Tool(Java堆分析工具),jhat 也是 jdk 内置的工具之一. 功能:主要是用来分析java堆的命令,可以将堆中的对象以 ...

  4. 可视化分析工具Qlik进阶

    不再是商业智能BI的Congons和水晶报表用图表透视数据,不再是Flash交互增强的MSTR用图表体验数据,今天的Tableau和Qlik可视化分析技术是用可视化解读和操作数据.Qlik是一个架构灵 ...

  5. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  6. 开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

    开源java性能分析工具 鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能. 我们要确保用户获得他们能获得的最佳体验,并想知道我们的应用已启动并正在运行. 这 ...

  7. java dump分析工具_Java 性能分析工具 (2):Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  8. 开课吧:常见的数据可视化分析工具有哪些?

    数据分析工作的完成,既需要拥有良好的方式方法,同时还需要借助分析工具,这也是数据分析师需要熟练使用数据分析工具的主要原因,那么常见的数据可视化分析工具有哪些呢? 常见的数据可视化分析工具有哪些? 1. ...

  9. 数据可视化分析工具如何在国内弯道超车,迅速崛起?

    什么是数据可视化 数据可视化:Data Visualization,即视觉传达,为了清晰有效地传递信息,数据可视化通过统计图形.图表.信息图表和其他工具,例如点.线或条对数字数据进行编码,以便在视觉上 ...

最新文章

  1. bug诞生记——不定长参数隐藏的类型问题
  2. php中query()作用,query()方法
  3. Android伍什小随笔(二)- 更新中
  4. springboot入门_shiro
  5. linux脚本漏洞,Silver Peak VX跨站脚本漏洞(CVE-2014-2975)
  6. c# 中关键字_C#中的“使用”关键字
  7. android api 打开慢,为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...
  8. Navicate ---error 2003: can‘t connect to mysql server on ‘localhost‘(10061)“
  9. SELinux系列(八)——SELinux默认安全上下文的查询和修改(semanage命令)
  10. 【转】高并发情况下的单例模式
  11. bmd硬盘测试_硬盘测速工具:Blackmagic Disk Speed Test Mac
  12. 各层电子数排布规则_电子层排布,电子的排布规律
  13. 服务器独享宽带和共享宽带有那些区别
  14. 用微信h5棋牌源码来测量相机到目标的距离
  15. RediSearch一个媲美es的全文搜索引擎
  16. 小米秋招软件开发笔试题
  17. php蛇蛇大作战,贪吃蛇大作战
  18. Java NIO 非阻塞服务器端
  19. 搜题公众号搭建免费教程
  20. .net 5 windows 系统服务 workserver

热门文章

  1. 【论文笔记】SIFA——基于GAN的双向跨模态无监督域适应框架
  2. 哈工大计算机考研 跨考,2011年哈工大计算机考研经验_跨考网
  3. 自定义mui的索引列表indexedList(可用作通讯录)详细用法
  4. AndroidStudio写的个人信息修改界面
  5. 业务系统成功微服务化改造的实施步骤
  6. 关于大数据的视频资料
  7. uniapp小程序获取定位(高德SDK)
  8. 宝塔服务器源代码修改记录,宝塔BT面板修改相关记录,所有插件免费用
  9. #npm# extraneous问题
  10. python初级项目——名片管理系统(带视频教程)