JConsole可视化工具介绍

article/2025/9/21 14:57:20

JConsole 可视化工具介绍

一、 JConsole介绍

1.1 JConsole描述

Jconsole (Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具。

1.2 启动JConsole

  • 点击JDK/bin 目录下面的jconsole.exe 即可启动
  • 然后会自动自动搜索本机运行的所有虚拟机进程。
  • 选择其中一个进程可开始进行监控

JConsole连接


1.3JConsole基本介绍

JConsole 基本包括以下基本功能:概述内存线程VM概要MBean

运行下面的程序、然后使用JConsole进行监控;注意设置虚拟机参数

import java.util.ArrayList;
import java.util.List;/***  设置虚拟机参数:*  -Xms100M -Xms100m -XX:+UseSerialGC -XX:+PrintGCDetails*/
public class JConsoleTool {static class OOMObject {public byte[] placeholder = new byte[64 * 1024];}public static void fillHeap(int num) throws InterruptedException {Thread.sleep(20000); //先运行程序,在执行监控List<OOMObject> list = new ArrayList<OOMObject>();for (int i = 0; i < num; i++) {// 稍作延时,令监视曲线的变化更加明显Thread.sleep(50);list.add(new OOMObject());}System.gc();}public static void main(String[] args) throws Exception {fillHeap(1000);while(true){//让其一直运行着}}
}

1.3.1 内存监控

内存页签相对于可视化的jstat 命令,用于监视受收集器管理的虚拟机内存。

选项描述
Eden Space 的大小27328KB
已用正在使用
已提交27328KB
最大值27328KB
copy 上的 0.120s(3收集)新生代使用赋值算法(copy),0.120s,总共三次
MarkSweepCompact上的 0.037(1收集)老年代使用标记清除整理,耗时0.037,总共一次

对应的GC日志。

[GC (Allocation Failure) [DefNew: 27277K->3392K(30720K), 0.0349173 secs] 27277K->14749K(99008K), 0.0350411 secs] [Times: user=0.03 sys=0.00, real=0.04 secs] [GC (Allocation Failure) [DefNew: 30691K->3378K(30720K), 0.0446635 secs] 42049K->39217K(99008K), 0.0447387 secs] [Times: user=0.03 sys=0.01, real=0.04 secs] [GC (Allocation Failure) [DefNew: 30679K->3372K(30720K), 0.0408609 secs] 66518K->64734K(99008K), 0.0409604 secs] [Times: user=0.02 sys=0.02, real=0.04 secs] [Full GC (System.gc()) [Tenured: 61362K->66352K(68288K), 0.0372192 secs] 67024K->66352K(99008K), [Metaspace: 9535K->9535K(1058816K)], 0.0373411 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 

1.3.2 线程监控

如果上面的“内存”页签相当于可视化的jstat命令的话,“线程”页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、设备资
源等)、死循环锁等待(活锁和死锁)


下面三个方法分别等待控制台输入、死循环演示、线程锁等待演示

/*** 等待控制台输入* @throws IOException*/public static  void waitRerouceConnection () throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));br.readLine();}
/*** 线程死循环演示*/public static void createBusyThread() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true)   // 第41行;}}, "testBusyThread");thread.start();}/*** 线程锁等待演示*/public static void createLockThread(final Object lock) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}, "testLockThread");thread.start();}

(二)线程死锁演示

这段代码开了200个线程去分别计算1+2以及2+1的值,其实for循环是可省略的,两个线程也可能会导致死锁,不过那样概率太小,需要尝试运行很多次才能看到效果。一般的话,带for循环的版本最多运行2~3次就会遇到线程死锁,程序无法结束。造成死锁的原因是Integer.valueOf()方法基于减少对象创建次数和节省内存的考虑,[-128,127]之间的数字会被缓存[3],当valueOf()方法传入参数在这个范围之内,将直接返回缓存中的对象。也就是说,代码中调用了200次Integer.valueOf()方法一共就只返回了两个不同的对象。假如在某个线程的两个synchronized块之间发生了一次线程切换,那就会出现线程A等着被线程B持有的Integer.valueOf(1),线程B又等着被线程A持有的Integer.valueOf(2),结果出现大家都
跑不下去的情景。

package com.jvm;/*** 线程死锁验证*/
public class JConsoleThreadLock {/*** 线程死锁等待演示*/static class SynAddRunalbe implements Runnable {int a, b;public SynAddRunalbe(int a, int b) {this.a = a;this.b = b;}@Overridepublic void run() {synchronized (Integer.valueOf(a)) {synchronized (Integer.valueOf(b)) {System.out.println(a + b);}}}}public static void main(String[] args) {for (int i = 0; i < 100; i++) {new Thread(new SynAddRunalbe(1, 2)).start();new Thread(new SynAddRunalbe(2, 1)).start();}}}

线程死锁

结果描述:显示了线程Thread-53在等待一个被线程Thread-66持有Integer对象,而点击线程Thread-66则显示它也在等待一个Integer对象,被线程Thread-53持有,这样两个线程就互相卡住,都不存在等到锁释放的希望了


二、 VisualVM介绍

VisualVM(All-in-One Java Troubleshooting Tool);功能最强大的运行监视和故障处理程序

2.1 功能描述

  • 显示虚拟机进程以及进程的配置环境信息jpsjinfo)。
  • 监视应用程序的CPUGC、方法区(1.7及以前),元空间(JDK1.8及以后)以及线程的信息(jstat、jstack)。
  • dump以及分析堆转储快照(jmap、jhat)。
  • 方法级的程序运行性能分析找出被调用最多、运行时间最长的方法
  • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照

2.2 使用教程

如何使用,直接查看官网和本书教程即可。


参看资料

  • VisualVM官网地址:帮助文档
  • BTrace 简要介绍
  • 《深入理解java虚拟机》–周志明

http://chatgpt.dhexx.cn/article/j1r2REre.shtml

相关文章

附加:PageHelper分页插件的:Page和PageInfo的区别;

说明&#xff1a; &#xff08;1&#xff09;为什么写本篇博客&#xff1f;&#xff1a; ● 在【Spring Boot电商项目29&#xff1a;商品分类模块八&#xff1a;后台的【分类列表&#xff08;平铺&#xff09;】接口&#xff1b;】中&#xff0c;实现分页功能时&#xff0c;使用…

JSP之page对象及其常用方法

JSP之page对象及其常用方法

java常用page分页对象,mysql查询

1.创建page对象 public class PageUtils {//当前页默认第一页private Integer page 1;//默认每页10条private Integer limit 10;//总数private Integer count;//开始行private Integer startRow;//结束行private Integer endRow;public PageUtils(){this.startRow (page - …

JSP page对象

JSP内置对象——page对象 一、page对象&#xff1a;是指指向当前JSP页面本身&#xff0c;有点像类中的this指针&#xff0c;它是java.long.Object类的实例。 二、常用方法如下&#xff1a;主要是Object类中声明的方法class getClass() 返回此Object的类 int hashCode() 返回此O…

玩转MyBatis-Plus分页插件一:分页基本使用+方法解释+解析Page对象

hello&#xff0c;我是X&#xff0c;已经快半年的时间没有写过博文了&#xff0c;这段时间里我成长了许多&#xff0c;现在趁着放暑假的功夫&#xff0c;好好的总结一下我上半年的知识储备&#xff0c;信息量较大&#xff0c;赶紧上车吧&#xff01; 上车前晒一张后台系统分页的…

JSP的page对象

一 简介 page对象就是指向当前JSP页面本身&#xff0c;有点像类中的this指针&#xff0c;它是java.lang.Object类的实例。 二 常用方法 三 实例 <% page language "java" import "java.util.*" contentType "text/html; charsetutf-8" %&g…

6.Page对象详解

序 就好像用户看到的都是由dom表现出来的&#xff0c;所有的业务处理都是在Page对象中处理的。如果业务越简单&#xff0c;创建的Page对象数量就会越少&#xff1b;如果业务越复杂&#xff0c;那么相对而言Page对象数量就越多&#xff08;或Page实例对象就会越复杂&#xff09…

java中page的对象,page对象

page对象是JSP九大内置对象之一。JSP全称JavaServerPage&#xff0c;是一种动态网页技术标准&#xff0c;以Java语言作为脚本语言。在JSP中预先定义了九个内置对象,这个九个内置对象不需要声明就可以在脚本代码和表达式中任意使用&#xff0c;九个内置对象分别是&#xff1a;re…

Java程序员经典面试题+答案(全)

这套面试题主要目的是帮助那些还没有java软件开发实际工作经验&#xff0c;而正在努力寻找java软件开发工作的朋友在笔试时更好地赢得笔试和面试。 关注公众号【Java典籍】免费赠送一套Java入门视频教程一套&#xff01; 1、一个".java"源文件中是否可以包括多个类&a…

2023年Java最新面试题,附详解答案

写在前面&#xff1a;本篇面试题整理是我在广州地区进行面试整理得出&#xff0c;常见的基本都在下面了。基本都是可以直接在面试时用白话回答的答案总结&#xff0c;面试时照此回答即可&#xff0c;有其他常见面试问题也欢迎在评论区补充。 首次发布&#xff1a;202 3年 1月 更…

java初中级面试题集锦

目录 基础 &与&&区别 使用 final 关键字修饰一个变量时&#xff0c;是引用不能变&#xff0c;还是引用的对象不能变&#xff1f; 静态变量和实例变量的区别&#xff1f; 是否可以从一个 static 方法内部发出对非 static 方法的调用&#xff1f; ""…

Java程序员面试题(一)JavaSE基础 - 上

如果觉得文章对您有一点点帮助&#xff0c;麻烦帮忙点个赞?哦 目录 一、Java面向对象1. 面向对象都有哪些特性以及你对这些特性的理解2.访问权限修饰符 public、private、protected, 以及不写&#xff08;默认&#xff09;时的区别3.如何理解 clone 对象3.1 为什么要用 clone…

Java面试题200+大全(合适各级Java人员)

前言&#xff1a; 本文整理所得&#xff01;但是内容是很干货的&#xff01;我看了也有帮助。做个分享。该列表包含了入门级 Java 程序员和多年经验的高级开发者的问题。无论你是 1、2、3、4、5、6、7、8、9 还是 10 年经验的开发者&#xff0c;你都能在其中找到一些有趣的问题…

Java 程序员不得不会的 124 道面试题(含答案)

多线程、并发及线程的基础问题 1&#xff09;Java 中能创建 volatile 数组吗&#xff1f; 能&#xff0c;Java 中可以创建 volatile 类型数组&#xff0c;不过只是一个指向数组的引用&#xff0c;而不是整个数组。我的意思是&#xff0c;如果改变引用指向的数组&#xff0c;将…

java程序员面试常见面试题及答案整理

JAVA相关基础知识   1、面向对象的特征有哪些方面   1.抽象:   抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是…

2020年高级Java程序员面试题汇总,含答案总结

文章目录 JDKDubboZookeeperSpring系列Redis系列Mysql系列Java多线程消息中间件线程池JVM设计模式其他程序设计基础知识算法题面试技术外的问题面试答案引言: 随着金九银十的面试跳槽,回首在经历了两周的跳槽求职路后,终于成功拿到offer,距今已经入职快一个月了,因此,这几…

2018java程序员面试题整理

1.PathVariable注解和RequestParam注解的区别。 RequestParam注解是获取静态URL传入的参数 PathVariable是获取请求路径中的变量作为参数 /需要和RequestMapping("item/{itemId}") 配合使用 2.Param注解和RequestParam注解的区别。 Parm 指定request中必须包含某…

Java程序员不得不会的面试题(含答案)

每个技术人都有个大厂梦&#xff0c;我觉得这很正常&#xff0c;并不是饭后的谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司&#xff0c;如果说能够在这样的公司锻炼几年&#xff0c;相信对自己…

Java程序员面试题集(1-50)

一、Java基础部分 1、面向对象的特征有哪些方面? 答&#xff1a;面向对象的特征主要有以下几个方面&#xff1a; 1)抽象&#xff1a;抽象是将一类对象的共同特征总结出来构造类的过程&#xff0c;包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为&#xff0c…

Java程序员面试题

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案&#xff0c;原来的题目中有很多重复题目和无价值的题目&#xff0c;还有不少的参考答案也是错误的&#xff0c;修改后的Java面试题集参照了JDK最新版本&#xff0c;去掉了EJB 2.x等无用…