[JDK工具-10] jvisualvm 多合一故障处理工具

文章目录
- 1. 介绍
- 2. 查看堆的变化
- 3. 查看堆快照
- 4. 导出堆快照文件
- 5. 查看class对象加载信息
- 6. CPU分析:发现cpu使用率最高的方法
- 7. 查看线程快照:发现死锁问题
1. 介绍
-
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。
-
用于监控、故障诊断以及性能分析Java应用程序。JVisualVM 通过集成多个命令行JDK工具(如 jconsole, jinfo, jmap, jstack 等)的功能于一体,为用户提供了一个统一且易用的图形界面
位置:jdk\bin
作用:
- 查看应用jvm配置信息
- 查看cpu、内存、类、线程监控信息
- 查看堆的变化
- 查看堆快照
- 导出堆快照文件
- 查看class对象加载信息
- CPU分析:发现cpu使用率最高的方法
- 分析死锁问题,找到死锁的代码
界面如下:

2. 查看堆的变化
每隔3秒,堆内存使用新增100M
package com.xin.demo.threaddemo.bookdemo;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;public class JVisualVMDemo1 {public static final int _1M = 1024 * 1024;public static void main(String[] args) throws InterruptedException {List<Object> list = new ArrayList<>();for (int i = 0; i < 1000; i++) {list.add(new byte[100 * _1M]);TimeUnit.SECONDS.sleep(3);System.out.println(i);}}
}
查看内存变化

3. 查看堆快照
点击“监视”->”堆(dump)”可以生产堆快照信息.



4. 导出堆快照文件
点击右键另存为

可以用jvisualvm->文件->装入打开hprof文件,打开后如下图:

5. 查看class对象加载信息
package com.xin.demo.threaddemo.bookdemo;import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;public class JVisualVMDemo2 {private static List<Object> insList = new ArrayList<>();public static void main(String[] args) throws Exception {permLeak();}private static void permLeak() throws Exception {for (int i = 0; i < 2000; i++) {URL[] urls = getURLS();URLClassLoader urlClassloader = new URLClassLoader(urls, null);Class<?> logfClass = Class.forName("org.apache.commons.logging.LogFactory", true, urlClassloader);Method getLog = logfClass.getMethod("getLog", String.class);Object result = getLog.invoke(logfClass, "TestPermGen");insList.add(result);System.out.println(i + ": " + result);if (i % 100 == 0) {TimeUnit.SECONDS.sleep(1);}}}private static URL[] getURLS() throws MalformedURLException {File libDir = new File("D:\\javasoft\\apache-maven-3.2.1\\mavenrepository\\commons-logging\\commons-logging\\1.2");File[] subFiles = libDir.listFiles();int count = subFiles.length;URL[] urls = new URL[count];for (int i = 0; i < count; i++) {urls[i] = subFiles[i].toURI().toURL();}return urls;}
}
下图,可以观察到元空间、类的变化成正相关

6. CPU分析:发现cpu使用率最高的方法
CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。
没有程序运行时的 CPU 使用情况如下图:

下面我们写一个cpu占用率比较高的程序。
package com.xin.demo.threaddemo.bookdemo;public class JVisualVMDemo3 {public static void main(String[] args) throws InterruptedException {cpuFix();}/*** cpu 运行固定百分比** @throws InterruptedException*/public static void cpuFix() throws InterruptedException {// 80%的占有率int busyTime = 8;// 20%的占有率int idelTime = 2;// 开始时间long startTime = 0;while (true) {// 开始时间startTime = System.currentTimeMillis();/** 运行时间*/while (System.currentTimeMillis() - startTime < busyTime) {}// 休息时间Thread.sleep(idelTime);}}
}

过高的 CPU 使用率可能是我们的程序代码性能有问题导致的。可以切换到“抽样器”对cpu进行采样,可以擦看到那个方法占用的cpu最高,然后进行优化。

从图中可以看出cpuFix方法使用cpu最多,然后就可以进行响应的优化了。
7. 查看线程快照:发现死锁问题
Java 语言能够很好的实现多线程应用程序。当我们对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。
在 VisualVM 的监视标签内,我们可以查看当前应用程序中所有活动线程(Live threads)和守护线程(Daemon threads)的数量等实时信息。
可以查看线程快照,发现系统的死锁问题。
下面我们将通过visualvm来排查一个死锁问题。
package com.xin.demo.threaddemo.bookdemo;public class JVisualVMDemo4 {public static void main(String[] args) {Obj1 obj1 = new Obj1();Obj2 obj2 = new Obj2();Thread thread1 = new Thread(new SynAddRunalbe(obj1, obj2, 1, 2, true));thread1.setName("thread1");thread1.start();Thread thread2 = new Thread(new SynAddRunalbe(obj1, obj2, 2, 1, false));thread2.setName("thread2");thread2.start();}/*** 线程死锁等待演示*/public static class SynAddRunalbe implements Runnable {Obj1 obj1;Obj2 obj2;int a, b;boolean flag;public SynAddRunalbe(Obj1 obj1, Obj2 obj2, int a, int b, boolean flag) {this.obj1 = obj1;this.obj2 = obj2;this.a = a;this.b = b;this.flag = flag;}@Overridepublic void run() {try {if (flag) {synchronized (obj1) {Thread.sleep(100);synchronized (obj2) {System.out.println(a + b);}}} else {synchronized (obj2) {Thread.sleep(100);synchronized (obj1) {System.out.println(a + b);}}}} catch (InterruptedException e) {e.printStackTrace();}}}public static class Obj1 {}public static class Obj2 {}
}
程序中:thread1持有obj1的锁,thread2持有obj2的锁,thread1等待获取obj2的锁,thread2等待获取obj1的锁,相互需要获取的锁都被对方持有者,造成了死锁。程序中出现了死锁的情况,我们是比较难以发现的。需要依靠工具解决。
打开visualvm查看堆栈信息:

点击线程Dump,生成线程堆栈信息:

上面这段信息可以看出,thread1持有Obj1对象的锁,等待获取Obj2的锁,thread2持有Obj2的锁,等待获取Obj1的锁,导致了死锁。
相关文章:
[JDK工具-10] jvisualvm 多合一故障处理工具
文章目录 1. 介绍2. 查看堆的变化3. 查看堆快照4. 导出堆快照文件5. 查看class对象加载信息6. CPU分析:发现cpu使用率最高的方法7. 查看线程快照:发现死锁问题 1. 介绍 VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具…...
【GateWay】自定义RoutePredicateFactory
需求:对于本次请求的cookie中,如果userType不是vip的身份,不予访问 思路:因为要按照cookie参数进行判断,所以根据官方自带的CookieRoutePredicateFactory进行改造 创建自己的断言类,命名必须符合 xxxRout…...
今日总结2024/5/27
今日学习了状态压缩DP,状态压缩DP分为棋盘型(基于连通性)和集合型 Acwing.1064 小国王 在 nn的棋盘上放 k个国王,国王可攻击相邻的 8个格子,求使它们无法互相攻击的方案总数。 输入格式 共一行,包含两个整数 n和 k。 输出格式 共一行&…...
使用 Snort 进行入侵检测
使用 Snort 进行入侵检测 Snort 是一种流行的开源入侵检测系统。您可以在http://www.snort.org/上获取它。Snort 分析流量并尝试检测和记录可疑活动。Snort 还能够根据其所做的分析发送警报。 Snort 安装 在本课中,我们将从源代码安装。此外,我们不会安…...
C++ | Leetcode C++题解之第116题填充每个节点的下一个右侧节点指针
题目: 题解: class Solution { public:Node* connect(Node* root) {if (root nullptr) {return root;}// 从根节点开始Node* leftmost root;while (leftmost->left ! nullptr) {// 遍历这一层节点组织成的链表,为下一层的节点更新 next…...
计算机网络学习
文章目录 第一章信息时代的计算机网络因特网概述电路交换,分组交换,报文交换计算机网络的定义和分类计算机网络的性能指标常见的三种计算机网络体系计算机网络体系结构分层的必要性计算机网络体系结构分层思想举例计算机网络体系结构中的专用术语 第二章…...
代码随想录算法训练营第四天| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
24.两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 解题思路 很麻烦的一道题目,不是很理解。还是看视频文章才AC的。 解法1 …...
职业探索--运维体系-SRE岗位/CRE岗位/运维岗位-服务心态-运维职业发展方向-运维对象和运维场景
参考来源: 极客时间专栏:赵成的运维体系管理课 极客时间专栏:全栈工程师修炼指南 赵成大佬在鹏讯云社区的文章(77篇) 有了CMDB,为什么还要应用配置管理 故障没有根因,别再找了 如何理解CMDB的套…...
深入理解C++智能指针系列(五)
引言 前面两篇介绍了std::unique_ptr的自定义删除器以及如何优化删除器的使用。本文将介绍std::unique_ptr在使用过程中的一些“奇技淫巧”。 正文 删除器和std::move std::move是将对象的所有权转移给另一个对象,那如果通过std::move来转移带自定义删除器的std::…...
1.Nginx上配置 HTTPS
1.安装 Nginx: 如果还没有安装 Nginx,可以使用包管理工具安装。例如,在 Ubuntu 上: sudo apt update sudo apt install nginx2.上传证书和私钥文件: 将你的证书文件和私钥文件上传到服务器上的某个目录,…...
wordpress教程视频 wordpress教程网盘 wordpress教程推荐wordpress教程网
WordPress,作为一款强大且灵活的开源内容管理系统,已成为许多网站开发者与运营者的首选。其强大的功能、丰富的插件以及易于上手的特点,使得无论是初学者还是专业开发者都能轻松构建出个性化的网站。然而,对于初学者来说ÿ…...
vue3 3D炫酷模型banner图
项目场景: 在官网首页展示3D炫酷动画模型,让整个模型都展示出来。 问题描述 主要是3D动画的展示效果,有些3d模型网站可以从51建模网站中获取。 案例代码: <script setup> import * as imgs from ../units/img import { o…...
小程序内使用路由
一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…...
【数据结构】第七节:堆
个人主页: 深情秋刀鱼-CSDN博客 数据结构专栏:数据结构与算法 源码获取:数据结构: 上传我写的关于数据结构的代码 (gitee.com) 目录 一、堆 1.堆的概念 2.堆的定义 二、堆的实现 1.初始化和销毁 2.插入 向上调整算法 3.删除 向下调整算法…...
前端大师-高级Web开发测验
目录 前言 1.按正确的执行顺序排列脚本 2.哪些说法是正确的?(D) 3.填写正确的术语 4.程序的输出 5.将资源提示与其定义匹配 6.以下程序的输出是? 7.将PerformanceNavigationTimings按正确的顺序排列 8.将缓存指令与其定义…...
延迟初始化和密封类
Kotlin 延迟初始化(Lazy Initialization) 定义 在 Kotlin 中,延迟初始化允许你延迟一个对象的初始化,直到首次访问该对象时才进行初始化。这通常用于那些初始化开销较大,或者只在程序运行的某个特定点才需要的对象。…...
Kotlin基础之基本语法
Kotlin 简介 Kotlin 是一种由 JetBrains 开发的静态类型编程语言,设计用于与 Java 虚拟机 (JVM) 兼容,同时也可用于 Android、JavaScript(通过 Kotlin/JS)和原生(通过 Kotlin/Native)开发。Kotlin 旨在提供…...
多态(难的起飞)
注意 virtual关键字: 1、可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一 2、可以菱形继承中,去完成虚继承,解决数据冗余和二义性 两个地方使用了同一个关键字,但是它们互相一点关系都没有 虚函…...
安装GO环境
#windows 1.下载go的安装包msi,下载完双击运行,指定一个目录进行安装 #msi安装时,会自动设置以下环境变量: #GOPATH(默认设置为C:\Users\hhx\go), #C:\Users\hhx\go\bin, #go安装位置下的bin目录 2.检查是否安装成功,终端中运行go version解释一些环境变量 GOROOT:go的安装位置…...
记一次由于代码原因导致Mysql连接被打满和唯一索引重复问题
先说一下事情产生的背景:原先的代码逻辑是消费MQ,然后请求其他服务的接口,对接口的返回值result做落库操作,现在要新加个逻辑,做完落库操作后还要再将result封装落到新表中;即消费一次MQ(MQ消息的频率非常高…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...
