JVMj之console Java监视与管理控制台
jconsole Java监视与管理控制台
1、jconsole介绍
jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions)
的可视化监视和管理工具。
2、启动jconsole
1、在linux和windwos下通过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线程堆栈信息,也可以发现死锁。


相关文章:
JVMj之console Java监视与管理控制台
jconsole Java监视与管理控制台 1、jconsole介绍 jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions) 的可视化监视和管理工具。 2、启动jconsole 1、在linux和windwos下通过jconsole启动即可。 2、然后会自动搜索本机运行的…...
Android进阶知识:ANR的定位与解决
1、前言 ANR对于Android开发者来说一定不会陌生,从刚开始学习Android时的一不注意就ANR,到后来知道主线程不能进行耗时操作注意到这点后,程序出现ANR的情况就大大减少了,甚至于消失了。那么真的是只要在主线程做耗时操作就会产生…...
基于SSM的老年公寓信息管理(有报告)。Javaee项目
演示视频: 基于SSM的老年公寓信息管理(有报告)。Javaee项目 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvc …...
阿里云 ACK 新升级,打造智算时代的现代化应用平台
云布道师 今天,能想到的或是想不到的领域,对容器和 Kubernetes 的需求都居高不减,使这项技术正在真正走向无处不在。 在 2023 云栖大会上,阿里云云原生产品线容器服务负责人易立关于容器服务 ACK 在本届亚运会上应用的介绍&#…...
CodeWhisperer 一款好玩的 AI 插件
忙里抽闲,今天试了试 CodeWhisperer 这款插件,我是在 IDEA 中做的测试,下面是我的一些使用感想: 安装 CodeWhisperer 插件:在 IntelliJ IDEA 中,可以通过插件管理器安装 CodeWhisperer 插件,然…...
大模型生态新篇章:以AI Agent为引,助企业创新应用落地
文 | 智能相对论 作者 | 沈浪 以聊天机器人、虚拟助手、智能客服等为代表的对话式人工智能 (Conversational AI Agents ) 在具体服务场景中的应用已经十分普遍。今年以来,随着大模型技术的爆发与加持,对话式AI被市场赋予了更高的期望。 “所有行业都值…...
什么是网络安全工程师,你想知道的都在这里!
随着互联网的发展和大数据时代的到来,网络已经日渐深入到我们生活、工作中的方方面面,社会信息化和信息网络化,突破了应用信息在时间和空间上的障碍,使信息的价值不断提高。但是,与此同时,网页篡改、计算机…...
uniapp开发的微信小程序进行代码质量控制,分包+压缩js+组件按需注入等
小程序代码分包的操作请看另外一篇文章:uniapp分包优化,包括分包路由跳转规则-CSDN博客 JS文件压缩:在工具「详情」-「本地设置」中开启「上传代码时自动压缩脚本文件」的设置 代码包:组件 > 启用组件按需注入解决办法 在小程…...
GD32替换STM32使用HAL库开发问题
GD32HAL库开发问题 1can初始化进入error handle2发送邮箱不能按照填写顺序发送3 GD32修改代码被stm32cudemx覆盖问题 1can初始化进入error handle HAL库的HAL_CAN_Init中,hcan->Instance->MSR寄存器无法清零,STM32先清零,再退出睡眠模…...
PE文件分析
用PEView及Python程序分析压缩包中的lab01.exe和lab01.dll两个PE文件,关键步骤给出截图: 分析两个文件的文件头中的各部分; 2.找出时间戳,计算出两个文件的生成时间; 注:时间戳为从1970年1月1日0时0分0秒到…...
MySQL 中文转拼音函数
需求是将字符串中的汉字转为拼音。创建一个汉字转拼音的函数,在其中判断每个字符是否为中文,如果是则查询拼音表取得对应的拼音,否则原样返回。网上的大部分 MySQL 转拼音函数都是通过创建一个拼音对照表,然后在自定义函数中查询该…...
HTML5+CSS3+JS小实例:蜂巢里的小蜜蜂光标特效
实例:蜂巢里的小蜜蜂光标特效 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conten…...
leetcode做题笔记1410. HTML 实体解析器
「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括: 双引号:字符实体为 " ,对应的字符是 "…...
sql18(Leetcode1633各赛事的用户注册率)
代码: # Write your MySQL query statement belowselect r.contest_id,round(count(u.user_id)/(select count(user_id) from Users)*100,2) as percentage fromRegister as r left joinUsers as u on u.user_idr.user_id group by contest_id order by percen…...
开发旅游APP的意义
开发旅游APP的意义在于: 提升旅游服务水平:旅游APP能够提供更便捷、更高效的服务,例如随时随地在线获取新的出行信息,可以随时下单出行,游客可以获得最新的旅游指南、在线预订线路、酒店、当地美食、美食和天气预报等…...
docker安装xxl-job
主打的就是一个简洁明了!!! 脚本集合 新建 docker-compose.yml version: "3" services:xxl-job-mysql:image: mysql:5.7.35restart: always container_name: xxl-job-mysql environment:#设置root的密码MYSQL_ROOT_PASSWORD: yK…...
Django QuerySet.order_by SQL注入漏洞(CVE-2021-35042)
漏洞描述 Django 于 2021年7月1日发布了一个安全更新,修复了函数QuerySet.order_by中的 SQL 注入漏洞。 参考链接: Django security releases issued: 3.2.5 and 3.1.13 | Weblog | Django 该漏洞需要开发人员使用order_by功能。此外,还可…...
鼠标拖拽问题,不选中文本不触发单击事件
文章目录 1. 为什么鼠标单击的时候触发了mousemove事件?明明鼠标没有移动2. 鼠标拖拽元素怎么能不触发单击事件?怎么处理鼠标在元素内的相对定位,而不是每次定位到左上角?方式一:拖拽的元素没有注册click监听就不会触发…...
Java 之 final 详解
目录 一. 前言 二. final 的基础使用 2.1. 修饰类 2.2. 修饰方法 2.2.1. private 方法是隐式的 final 2.2.2. final 方法可以被重载 2.3. 修饰参数 2.4. 修饰变量 2.4.1. static final 2.4.2. blank final 2.4.3. 所有 final 修饰的字段都是编译期常量吗?…...
数据分析策略
文章目录 我想对比不同完整度40%,50%,60%抽样计算来10min的TI序列,它们的差异与完整率的关系,告诉我怎么对比即可 了解您的分析目标后,我可以提供一个比较不同完整度(40%,50%,60%&am…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
