JVMj之console Java监视与管理控制台

jconsole Java监视与管理控制台

1、jconsole介绍

jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions)

的可视化监视和管理工具。

2、启动jconsole

1、在linuxwindwos下通过jconsole启动即可。

2、然后会自动搜索本机运行的所有虚拟机进程。

3、选择其中一个进程可开始进行监控。

在这里插入图片描述

在这里插入图片描述

3、jconsole基本介绍

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

运行下面的程序,然后使用jconsole进行监控,注意设置虚拟机参数。

package com.example.controller;import java.util.ArrayList;
import java.util.List;public class Demo1 {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) {//让其一直运行着}}
}

配置启动参数:-Xms100M -XX:+UseSerialGC -XX:+PrintGCDetails

在这里插入图片描述

在这里插入图片描述

可以切换顶部的选项卡查看各种指标信息:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

内存监控

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

在这里插入图片描述

代码运行,控制台也会输出gc日志:

[GC (Allocation Failure) [DefNew: 27305K->3392K(30720K), 0.0087378 secs] 27305K->14929K(99008K), 0.0088041 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 30720K->3369K(30720K), 0.0125603 secs] 42257K->38591K(99008K), 0.0125827 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 30697K->3367K(30720K), 0.0206170 secs] 65919K->63766K(99008K), 0.0206669 secs] [Times: user=0.00 sys=0.02, real=0.02 secs] 
[Full GC (System.gc()) [Tenured: 60398K->66528K(68288K), 0.0339940 secs] 66709K->66528K(99008K), [Metaspace: 9255K->9255K(1058816K)], 0.0343586 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 

4、线程监控

如果上面的内存页签相当于可视化的jstat命令的话,线程页签的功能相当于可视化的jstack命令,遇到线程停顿

时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、

设备资源等)、死循环、锁等待(活锁和死锁)

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

**第一步:**运行下面的代码。

package com.example.controller;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Demo2 {public static void main(String[] args) throws IOException {waitRerouceConnection();createBusyThread();createLockThread(new Object());}/*** 等待控制台输入** @throws IOException*/public static void waitRerouceConnection() throws IOException {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));try {br.readLine();} catch (IOException e) {e.printStackTrace();}}}, "waitRerouceConnection");thread.start();}/*** 线程死循环演示*/public static void createBusyThread() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {;}}}, "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();}
}

**第二步:**打开jconsole中查看上面程序运行情况,可以查看到3个目标线程。

在这里插入图片描述

在这里插入图片描述

**第三步:**查看目标线程信息

waitRerouceConnection线程处于读取数据状态,如下图:

在这里插入图片描述

testBusyThread线程位于代码45行,处于运行状态,如下图:

在这里插入图片描述

testLockThread处于活锁等待状态,如下图:

在这里插入图片描述

只要lock对象的notify()或notifyAll()方法被调用,这个线程便可能激活以继续执行。

通过 线程 这个窗口可以很方便查询虚拟机中的线程堆栈信息,对发现系统中的一些问题非常有帮助。

5、线程死锁演示

**第一步:**运行下面代码:

package com.example.controller;public class Demo3 {public static void main(String[] args) {User u1 = new User("u1");User u2 = new User("u2");Thread thread1 = new Thread(new SynAddRunalbe(u1, u2, 1, 2, true));thread1.setName("thread1");thread1.start();Thread thread2 = new Thread(new SynAddRunalbe(u1, u2, 2, 1, false));thread2.setName("thread2");thread2.start();}/*** 线程死锁等待演示*/public static class SynAddRunalbe implements Runnable {User u1, u2;int a, b;boolean flag;public SynAddRunalbe(User u1, User u2, int a, int b, boolean flag) {this.u1 = u1;this.u2 = u2;this.a = a;this.b = b;this.flag = flag;}@Overridepublic void run() {try {if (flag) {synchronized (u1) {Thread.sleep(100);synchronized (u2) {System.out.println(a + b);}}} else {synchronized (u2) {Thread.sleep(100);synchronized (u1) {System.out.println(a + b);}}}} catch (InterruptedException e) {e.printStackTrace();}}}public static class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}}
}

thread1持有u1的锁,thread2持有u2的锁,thread1等待获取u2的锁,thread2等待获取u1的锁,相互需要获取

的锁都被对方持有者,造成了死锁。程序中出现了死锁的情况,我们是比较难以发现的。需要依靠工具解决。刚好

jconsole就是这个美妙的工具。

**第二步:**在jconsole中打开上面程序的监控信息:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从上面可以看出代码39行和46行处导致了死锁。

在这里插入图片描述

关于程序死锁的,我们还可以使用命令行工具jstack来查看java线程堆栈信息,也可以发现死锁。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212347.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zero-Shot Restoration of Back-lit Images Using Deep Internal Learning

ABSTRACT 如何恢复背光图像仍然是一项具有挑战性的任务。该领域最先进的方法基于监督学习&#xff0c;因此通常仅限于特定的训练数据。在本文中&#xff0c;我们提出了一种用于背光图像恢复的“零样本”方案&#xff0c;该方案利用深度学习的力量&#xff0c;但不依赖于任何先…

好工具|datamap,一个好用的地图可视化Excel插件,在Excel中实现地理编码、拾取坐标

在做VRP相关研究的时候&#xff0c;需要对地图数据做很多处理&#xff0c;比如地理编码&#xff0c;根据“重庆市沙坪坝区沙正街174号”这样的一个文本地址知道他的经纬度&#xff1b;再比如绘制一些散点图&#xff0c;根据某个位置的经纬度在地图上把它标注出来。还有有的时候…

标签打印机打印标签时出现,数据处理过程中错误 无法设置项目 图片1的内容无法打印

环境&#xff1a; Win10专业版 NiceLabel Designer 10.1 问题描述&#xff1a; 标签打印机打印标签时出现&#xff0c;数据处理过程中错误 无法设置项目 图片1的内容无法打印 解决方案&#xff1a; 1.删除标签部分文字打印测试 还是一样&#xff08;未解决&#xff09; …

数字逻辑电路基础-时序逻辑电路之触发器

文章目录 一、D触发器二、verilog源码三、综合及仿真结果一、D触发器 本文介绍数字逻辑电路中常用的基础时序逻辑电路触发器。它有记忆和存储信息功能,触发器是边沿触发电路。 下图是触发器常用表示方式(时钟上升沿有效): 触发器由两个锁存器组成,前级是主锁存器,后级…

python爬取天气数据并做可视化分析

数据采集逻辑 数据schema 历史天气数据schema { ‘当日信息’&#xff1a;2023-01-01 星期日, 最高气温: 8℃, 最低气温: 5℃, ‘天气’: 多云, 风向信息:北风 3级 } 数据爬取 1.导入库 import numpy as np import pandas as pd import requests from bs4 import BeautifulSoup…

什么是指针碰撞

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见&#xff0c;经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别&#xff0c;oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多&#xff0c;这就导致数据…

LabVIEW中如何达到NI SMU最大采样率

LabVIEW中如何达到NI SMU最大采样率 NISMU的数字化仪功能对于捕获SMU详细的瞬态响应特性或表征待测设备&#xff08;DUT&#xff09;响应&#xff08;例如线性调整率和负载调整率&#xff09;至关重要。没有此功能&#xff0c;将需要一个外部示波器。 例如&#xff0c;假设在…

vite项目配置vite.config.ts在打包过程中去除日志

在生产环境上&#xff0c;务必要将日志清除干净&#xff0c;其因有二&#xff0c;在webgis系统中&#xff0c;有很多几何数据&#xff0c;体积大、数量多&#xff0c;很容易引起系统卡顿&#xff1b;清除log后&#xff0c;系统看着舒服&#xff0c;协同开发有很多无聊的日志&am…

C++基础入门(超详细)

话不多说&#xff0c;序言搞起来&#xff1a; 自从开始学老师布置的任务后&#xff0c;目前还是OpenCV&#xff0c;哈~哈。我就莫名问老师&#xff1a;“以后编程是用C还是python&#xff1f;”&#xff0c;果然还是太年轻&#xff0c;老师说&#xff1a;“两们都要精通”。唉&…

在C语言中\t的作用

\t为转义字符。转义字符是一种特殊的字符常量。以反斜线"\"开头&#xff0c;后跟字符。具有特定的含义&#xff0c;不同于字符原有的含义&#xff0c;故称“转义”字符。 【\t】是水平制表符&#xff0c;作用为补全前面字符串的位数到8的整数倍。若\t前面没有字符/字…