jvm之图形化工具

news2024/11/17 1:44:10

写在前面

本文一起看下jvm图形化相关的工具,图形化的工具相比于命令行工具的好处是更加直观,也更容易分析问题。

1:jconsole

1.1:准备要连接的jvm进程

定义如下的类;

package a.b;
import java.util.concurrent.*;

public class JsoncoleTest {
	private static CountDownLatch cdl = new CountDownLatch(1);
	
	public static void main(String[] args) throws Exception {
		System.out.println("JsoncoleTest run...");
		cdl.await();
	}
}

然后编译并且运行:

bogon:temp xb$ javac -d . JsoncoleTest.java 
bogon:temp xb$ java a.b.JsoncoleTest
JsoncoleTest run...

1.2:运行jconsole

直接在命令执行jsoncole,即可打开,如下:

在这里插入图片描述

可以看到本地进程远程进程,这里我们连接前面创建本地JVM进程,双击即可进入,如下:

在这里插入图片描述

主要包括的tab签有概览,内存,线程,类,VM概要,分别来看下。

1.3:概览

在概览展示了堆内存的使用量,线程个数,加载类的个数,CPU使用量等信息,具体的我们通过后边内容来看。

1.4:内存

jconsole将内存区域分为堆和非堆,其中非堆主要包括Metaspace元数据区(对jvm的方法区规范的实现,存储类信息,方法信息,常量信息等),以及其他内存区域。如下图:

在这里插入图片描述

1.5:线程

展示线程的数量信息和详细列表信息,作用同jstack -l,如下:

在这里插入图片描述

将我们前面的类修改为如下;

package a.b;
import java.util.concurrent.*;

public class JsoncoleTest {
	private static CountDownLatch cdl = new CountDownLatch(1);
	
	public static void main(String[] args) throws Exception {
		System.out.println("JsoncoleTest run...");
		for (int i = 0; i < 100 ; i++) {
			new Thread(() -> {try {
				Thread.sleep(90000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}}, "xxxx" + i).start();
			Thread.sleep(1000);
		}
		cdl.await();
	}
}

则可以看到线程数量在不断的增多:

在这里插入图片描述

1.6:类

以加载的类的个数信息,当类定义如下时加载的类的个数是2182:

package a.b;
import java.util.concurrent.CountDownLatch;

public class JsoncoleTest {
	private static CountDownLatch cdl = new CountDownLatch(1);
	
	public static void main(String[] args) throws Exception {
		System.out.println("JsoncoleTest run...");
		cdl.await();
	}
}

在这里插入图片描述

1.7:VM概要

VM的概要信息,如加载的类路径信息,类个数信息,堆内存大小信息,运行时间等:

在这里插入图片描述

2:jvisualvm

我们重点看下抽样器,抽样器可以动态的分析堆内存的对象实例信息(jmap -histo的动态版本),以及各个方法的CPU占用信息,分别看下。

2.1:抽样器-内存

首先定义测试类,如下:

package a.b;

import java.util.*;
import java.util.concurrent.*;

public class JvisualVmTest {
	static List<JvisualVmTest> list1 = new ArrayList();
	static CountDownLatch cdl = new CountDownLatch(1);
	public static void main(String[] args) throws Exception {
		for (int i=0;i<1000000;i++) {
			list1.add(new JvisualVmTest());
			Thread.sleep(5);
		}
		cdl.await();
	}
}

编译运行:

D:\test>javac -d . JvisualVmTest.java
注: JvisualVmTest.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

D:\test>java -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=8011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false a.b.JvisualVmTest

连接后点击抽样器->内存:

在这里插入图片描述

进入下图:

在这里插入图片描述

为了方便我们看动态效果,可以使用左下角过滤功能只显示我们要测试的类,如下截图2次可以看到类实例个数的变化:

在这里插入图片描述

在这里插入图片描述

2.2:抽样器-CPU

使用该功能可以动态的查看各个方法执行的CPU占比,如下测试代码:

package a.b;

import java.util.*;
import java.util.concurrent.*;

public class JvisualVmCpuTest {

	static CountDownLatch cdl = new CountDownLatch(1);
	static String num = "";
	public static void main(String[] args) throws Exception {
		new JvisualVmCpuTest().cpuConsume();
		cdl.await();
	}

	public void cpuConsume() {
		final double SPLIT = 0.01;
		final int COUNT = (int) (2 / SPLIT);
		final double PI = Math.PI;
		final int INTERVAL = 200;
		long[] busySpan = new long[COUNT];
		long[] idleSpan = new long[COUNT];
		int half = INTERVAL / 2;
		double radian = 0.0;
		for (int i = 0; i < COUNT; i++) {
			busySpan[i] = (long) (half + (Math.sin(PI * radian) * half));
			idleSpan[i] = INTERVAL - busySpan[i];
			radian += SPLIT;
		}
		long startTime = 0;
		int j = 0;
		while (true) {
			j = j % COUNT;
			startTime = System.currentTimeMillis();
			while (System.currentTimeMillis() - startTime < busySpan[j])
				;
			try {
				if(idleSpan[j]<70){
					Thread.sleep(idleSpan[j]);
				}
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			j++;
		}
	}
}

编译运行:

D:\test>javac -d . JvisualVmCpuTest.java

D:\test>java -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=8011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false a.b.JvisualVmCpuTest

连接后,查看抽样器,点击CPU,就可以动态查看CPU占用信息了:

在这里插入图片描述

写在后面

参考文章列表

方法区、永久代、元空间的区别 。

使用Java故意消耗Cpu和内存的代码 。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux内核架构和工作原理

**前言&#xff1a;**作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内…

JavaScript模板引擎Template.js基本使用详解

template.js是一款JavaScript模板引擎&#xff0c;提供一套模板语法&#xff0c;简单好用&#xff0c;开发者可以写一个模板区块&#xff0c;每次传入的数据&#xff0c;生成对应数据产生的HTML片段&#xff0c;渲染不同的效果。官网&#xff1a;简洁语法版 https://github.com…

天猫数据分析:2023年Q1天猫净水器品牌销售TOP10排行榜

水质的好坏更是与人们的身体健康密切相关。随着社会经济的发展&#xff0c;居民生活水平提升&#xff0c;人们对饮用水质量、安全性的要求也不断提高&#xff0c;净水器也因此逐渐成为现代生活的必需品。 根据鲸参谋电商数据显示&#xff0c;2023年Q1在天猫平台上&#xff0c;净…

微服务#1 注册中心eareka和nacos

目录 注册中心: eureka 服务调用关系 eureka的作用 在Eureka架构中&#xff0c;微服务角色有两类 搭建EurekaServer服务, 服务注册和服务发现 Ribbon 负载均衡原理 ​编辑 负载均衡策略 饥饿加载 注册中心: nacos nacos服务搭建, 服务注册和发现 nacos服务集群属性 …

【shell脚本里的数组】

目录 一、数组的定义方法1、定义数组1.1、使用shell脚本来写出怎么查看这个数组有没有缺少元素1.2、使用shell脚本&#xff0c;来生成数组1.3、元素的切片 二、数组追加元素三、传输和传出1、向函数传入数组的值2、从函数返回数组 一、数组的定义方法 &#xff08; 20 10 60…

零基础入门人工智能学习路线:数学、编程、机器学习、深度学习和实践项目

如果你想开始学习人工智能&#xff0c;但是对于如何开始感到困惑&#xff0c;那么这里有一些零基础入门学习路线的建议&#xff0c;可以帮助你更好地理解和掌握人工智能的基础知识。 数学基础 作为人工智能的核心基础&#xff0c;数学知识是必不可少的。尤其是线性代数和概率论…

线性结构-链表

链表也是一种常用的线性数据结构&#xff0c;与数组不同的是&#xff0c;链表的存储空间并不连续&#xff0c;它是用一组地址任意的存储单元来存放数据的&#xff0c;也就是将存储单元分散在内存的各个地址上。 这些地址分散的存储单元叫做链表的节点&#xff0c;链表就是由一个…

亲测好用|甲方、专家和领导,用三维模型汇报方案如何投其所好?

身为设计方的你&#xff0c;有没有这样的经历&#xff1a; ➤ 一个非常优秀的方案未能被甲方采纳&#xff0c;反而甲方选择了一个不如自己的方案&#xff0c;造成了很大的遗憾&#xff1b; ➤ 在讲述自己的设计方案的时候&#xff0c;经常越说越散&#xff0c;甚至到了最后自…

ACM - 搜索与图论 - 基础(搜索 + 拓扑 + 最小生成树 + 最短路 + 二分图 + 欧拉路 + 最大流 + 其它)

搜索与图论 一、搜索1、分治矩阵二分 / 普通二分 模板万能二分模板 2、DFS例题1、AcWing 842. 排列数字例题2、AcWing 843. n-皇后问题 3、BFS例题1、AcWing 844. 走迷宫 (入门经典)例题2、到达 "12345678x"&#xff1a;AcWing 845. 八数码 二、图论写在前面1、图的存…

自学软件测试,从10K到40K的技术路线,也就是这些东西...

如果有一天我从梦中醒来时&#xff0c;发现自己的几年自动化测试工程师经验被抹掉&#xff0c;重新回到了一个小白的状态。我想要重新自学自动化测试&#xff0c;然后找到一份自己满意的测试工作&#xff0c;我想大概只需要6个月的时间就够了&#xff0c;如果比较顺利的话&…

Cursor--一款强大的国内智能AI语言模型(据说对接了chatgpt4)

简介 Cursor是一个集成了 GPT-4 的国内直接可以访问的&#xff0c;优秀而强大的免费代码生成器&#xff0c;可以帮助你快速编写、编辑和讨论代码。 它支持多种编程语言&#xff0c;如 Python, Java, C#, JavaScript 等&#xff0c;并且可以根据你的输入和需求自动生成代码片段…

eSIM证书要求-涉及规范SGP.22-SGP.26-1

文档 Official Document SGP.22 – RSP Technical Specification v2.4 Official Document SGP.26 - RSP Test Certificates Definition &#xff0c;包含官方测试证书 证书链的定义 三个曲线 为了便于互操作性&#xff0c;本规范仅限于以下三个曲线 AlgorithmIdentifier算法标…

英飞凌的AURIX TC4x系列芯片在汽车控制器上应用

英飞凌的AURIX TC4x系列微控制器--智能汽车安全的领导者来了! 汽车市场上出现了重大的颠覆者&#xff1a; 汽车E/E架构微控制器&#xff08;MCU&#xff09;在领域和区域控制方面的创新 加速从传统动力系统到xEV的转变 安全性和自动驾驶的提高。 英飞凌的AURIX TC4x系列解…

yolov5 8系列 labelme数据标注 并生成训练数据集

yolov5 8系列 labelme数据标注 数据集生成终极教程 一.数据集准备二.转换为yolo 数据集 一.数据集准备 创建一个data 文件夹在data文件夹下创建一个images 文件夹将所有图片数据放入images文件夹下 使用labelme标注数据 python环境下使用 pip install labelme 安装labelme在c…

边缘计算盒子要怎么选?

选择边缘计算盒子需要考虑以下几个因素&#xff1a; 性能需求&#xff1a;边缘计算盒子的性能应该与您的应用需求相匹配。如果需要处理大量数据或者部署多种复杂ai算法&#xff0c;那么就需要选择更高性能的盒子。 IVP06A边缘计算盒子是基于RV1126设计的一款支持深度智能边缘…

Makefile基础教程(条件判断语句)

文章目录 前言一、条件判断语句概念讲解1.ifeq 和 ifneq2.ifdef 和 ifndef3.ifeq 的比较操作符 二、条件判断语句的使用三、条件判断语句使用的注意事项四、条件判断语句只在预处理阶段有效总结 前言 本篇文章开始讲解Makefile中的条件判断语句&#xff0c;在各种编程语言中都…

远程桌面连接可以传文件么?

远程桌面连接是一种远程管理计算机的方式。它允许用户通过网络远程控制其他计算机。远程桌面连接可以用于各种目的&#xff0c;例如从远程地方访问办公室电脑、支持远程用户、教育、游戏等等。但是&#xff0c;在使用远程桌面连接时&#xff0c;用户可能会遇到一些问题&#xf…

8. 类的静态成员

一、对象的生产期 生存期&#xff1a;对象从诞生到结束的这段时间生存期分为静态生存期和动态生存期 1.1 静态生存期 对象的生存期与程序的运行期相同&#xff0c;则称它具有静态生存期在文件作用域中声明的对象都是具有静态生存期的若在函数内部的局部作用域中声明具有静态…

配置Windows终端像Linux终端一样直接执行Python脚本

配置Windows终端像Linux终端一样直接执行Python脚本 1. 将Python加入环境变量2. 将Python后缀加入环境变量PATHEXT中3. 修改Python脚本的默认打开方式4. *将Python脚本命令加入环境变量*5. 测试 在Linux系统中&#xff0c;在Python脚本的开头指定Python解释器路径&#xff0c;即…

Terry部落简介

通过一个简单的服务&#xff0c;整理使用的技术 服务简介 Terry部落&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis-plus MySQL Redis Kafka Elasticsearch shiro …&#xff09;实现的个人博客服务。包含登陆、注册、文章发布、资源发布、鉴…