当前位置: 首页 > news >正文

JVM 调优篇6 可视化性能监控工具-JVisual VM

一  Visual VM

1.1 概述

Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。

它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替JConsole。 

VisualVM: Home

1.在idea中进行安装:

2.功能结构说明:

1.2 概述

二  VisualGC功能介绍

2.1 visualGC的安装

如果页面缺少visual GC 插件,则需要选择【工具 -》 插件】进行安装,安装插件:

安装成功后,重启一下visualvm,就可以看到菜单栏上多出一个Visual GC插件:

2.2 功能页面介绍

Visual gc 工具分成布局分成三部分,可在右上角对应方框里勾选【Space】【Graphs】【Histogram】:

可视化GC窗口(space):space(Metaspace(元数据)、Old老年代、新生代(Eden、S0、S1))

图形统计窗口(Graphs):Graphs(Compile Time(编译时间)、Class Loader Time(类加载时间)、GC Time(垃圾收集时间)、Eden Space、Survivor 0、Survivor 1、Old Gen、Metaspace)

幸存者年龄直方图窗口(Histogram):Histogram(Parameters参数设置)

2.2.1 可视化GC窗口(space)

VisualGC窗口是最左的窗口,分成三条垂直柱体,在JDK1.8版本中,分别代表metaSpace元空间、Old老年代、新生代,其中新生代又划分成 Eden 区, S0 区, S1区三部分。柱体里颜色部分代表占用的空间,空白部分表示剩余空间。监控项目的堆进程时,这些代表颜色的地方都是动态变化的。

2.2.2 图形统计窗口Graphs)  

1.compile Time

功能:  显示将Java字节代码编译为本机代码所花费的时间量。窄脉冲表示持续时间相对较短,宽脉冲表示持续时间较长。

编译任务的数量:  1101 compiles(1101次编译)

累计编译时间:  27.721s。

2.class loader Time

此面板显示在类加载和卸载活动中花费的时间量。窄脉冲表示持续时间相对较短,宽脉冲表示持续时间较长。

加载的类数量:1058;

卸载的类的数量:63

累计的类加载时间:278.915s

3. GC Time:

此面板显示垃圾收集活动所花费的时间量。窄脉冲表示持续时间相对较短,宽脉冲表示持续时间较长。

执行GC垃圾回收总次数:42次(42collections代表自监视以来执行2次GC,其中,包括新生代的Minor GC和老年代的Full Gc

累计的GC时间: 140.179ms;

若JVM维护hotspot.gc.cause和hotspot.gc.last_cause计数器,则gc事件的原因将出现在last Cause中;

4.Eden space

此面板显示Eden空间随时间的利用情况。它是年轻代的三个空间之一,另外两个分别是S0、S1。空间的当前容量可以根据收集器策略动态更改,即通过修改–Xmn参数,会改变其大小。

标题栏第一个参数代表最大容量,第二个参数代表当前容量,后跟当前占用空间。此外,还包含了年轻代GC事件数量和GC累计时间。

Eden Space最大可分配空间:3.807G;

Eden Space当前已分配空间:210M;

Eden Space当前占用空间:162M(当积累的占用空间超过162M,就会在Eden Space发生一次Minor GC)

Minor GC次数:41次

Minor GC花费时间:618.824ms

 5.Survivor 0 and Survivor 1       

  HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to),默认大小比例为Eden:Survivor0:Survivor1=8:1:1的。 

新创建的非大对象,会存放在Eden区和一个作为from的Survivor区,当发生一次Minor GC时,就会将Eden区和作为from的Survivor区内仍存活的对象,复制到另一个作为to的Survivor区,然后清理掉原来Eden区和作为from的Survivor区内对象。因此,S0 和 S1 之间至少有一个肯定是空闲的。

Survivor 1区最大分配容量:3.807G;

Survivor 1区当前已分配容量:20M;

Survivor 1区当前占用容量:20M;

6.old Gen 

面板显示老年代随着时间推移的利用情况。

Old Gen 最大分配空间3.807G;

Old Gen 已分配空间2.654G;

Old Gen 当前占用空间1.964G;

Old Gen 发生的GC次数:0次;

Old Gen 发生的GC花费时间:0ms;

7.MetaSpace元空间内容 

标题栏在括号中显示空间的名称及其最大容量和当前容量,后跟空间的当前占用大小

最大元空间:1.062G

可用元空间: 6.688M

以占用元空间: 6.436M

https://blog.csdn.net/qq_41158114/article/details/137642072

三  VisualGC实操分析案例

3.1 案例分析

使用visual VM工具的Visual GC插件观察到以下的图表——新生代Eden区已经发生了8168次Minor GC,耗时39.754s,另外老年代也发生了24次GC,耗时5.124s。可见,该JVM参数设置得极不合理,导致已经过于频繁发生Minor GC。(除代码问题)

截图中,可以看到新生代中的Eden区频繁发生Minor GC,原因之一是分配的空间过小,目前是204.875M,导致当前占用空间经常超过204.875M,进而发生GC。若要分析是哪些代码频繁创建对象,还得进一步通过dump等方式进行分析,这里暂时不展开。 

这里采用解决思路:提升分配给Eden区的大小。

通过Visual VM的监视栏中的堆监控,可以观察到蓝色模块高度比较均衡地对应在纵坐标280MB的样子,也就是说,新创建的对象+每次gc未被清除的对象 其占有的大小达到近300MB(  见下图蓝色模块  ),而Eden Space + 其中一个Survivor才230MB左右(见上图,Eden区 204.875+25.562约等于230M),可见,每次新创建的对象很容易就超过新生代,这就意味着,频繁发生Minor GC是必然的,从图的横坐标可以看出,每30ms内,就发生了2到3次的Minor GC


优化实施:

为了避免Eden区频繁发生Minor GC,根据堆监控图表,可以考虑在设置JVM参数时,适当提升分配给Eden的空间。

就暂且先设置Eden区为320MB,考虑到Eden:Survivor0:Survivor1=8:1:1比例,也就是8:2,若要分配Eden=320M,那么,可以根据8/2=320/x算出来,x=80,这里的x就是两个Survivor总大小,即每个Survivor分配40MB,那么,年轻代总共需要分配的大小为(320M+40M*2)=400M,即-Xmn400m。

再来看下老年代,目前老年代发生了24次GC,最大分配空间是256MB,当前最小分配空间是71.48M,可见,还可以适当进行优化。


根据堆=新生代+老年代,不包括永久代(方法区)。在新生代已经分配400MB情况下,若要让老年代最大与最小分配空间都为256MB,那么,就需要对JVM堆分配400M+256M=656M的空间大小,即设置-Xms656M、-Xmx656M;
 元空间暂且可以不考虑进行分配。        

最后,根据以上得出的参数,进行设置,然后以设置好的参数进行项目重启,根据新一轮图表展示,继续进行参数优化,循环调试,直到新生代和老年代的GC频率都保持一个比较平衡的水准。

3.2 获取堆文件的两种方式

1.设置参数在异常发生时自动生成dump文件。

-XX:+HeapDumpOnOutOfMemoryError 表示当JVM发生OOM时,自动生成DUMP文件。

-XX:HeapDumpPath=存储文件/目录 表示生成DUMP文件的路径

2.手动生成dump分析文件

执行jmap -dump:format=b,file=20210321.dump 7132,其中7132是对应项目的进程PID。

将获取到的dump文件手动导入到Visual VM工具,就可以分析哪些对象占用内存高了,往往可以分析出哪些对象造成了内存泄露问。

相关文章:

JVM 调优篇6 可视化性能监控工具-JVisual VM

一 Visual VM 1.1 概述 Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。 它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat…...

C#学习笔记(三)Visual Studio安装与使用

博主刚开始接触C#,本系列为学习记录,如有错误欢迎各位大佬指正!期待互相交流! 上一篇文章中安装了Visual Studio Code来编写调试C#程序,但是博主的目标是编写带窗口的应用程序,了解之后发现需要安装Visual …...

element-plus的菜单组件el-menu

菜单是几乎是每个管理系统的软件系统中不可或缺的,element-plus提供的菜单组件可以快速完成大部分的菜单的需求开发, 该组件内置和vue-router的集成,使用起来很方便。 主要组件如下 el-menu 顶级菜单组件 主要属性 mode:决定菜单的展示模式…...

深入浅出通信原理

深入浅出通信原理 文章目录 深入浅出通信原理前言一、概述二、信号和频谱2.1 信号2.2 信号的分解与合成2.3 傅里叶变换的特性2.4 离散傅里叶变化 三 信道3.1 衰减和损耗3.2 多普勒效应 四 信源编码4.1 采样4.2 量化4.3 编码 五 基带信号的发送和接受5.1 脉冲成形5.2 眼图 六 频…...

Gitee Pipeline 从入门到实战【详细步骤】

文章目录 Gitee Pipeline 简介Gitee Pipeline 实战案例 1 - 前端部署输入源NPM 构建Docker 镜像构建Shell 命令执行案例 2 - 后端部署全局参数输入源Maven 构建Docker 镜像构建Shell 命令执行参考🚀 本文目标:快速了解 Gitee Pipeline,并实现前端及后端打包部署。 Gitee Pi…...

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.什么是贪心算法 与其说是…...

【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…...

Scratch教学案例 —— 制作生日蛋糕

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 简介 在这个教学案例中,我们将使用Scratch制作一个简单而有趣的生日蛋糕动画。通过这个项目,学生可以学习到如何使用Scratch中的基本编程块进行角色控制、造型切换、舞台背景设置以…...

【深度学习】搞懂卷积神经网络(一)

卷积神经网络是一种具有局部连接,权重共享等特性的深层前馈神经网络。一般是由卷积层,池化层,全连接层交叉堆叠而成,使用反向传播算法进行训练。卷积神经网络具有一定程度上的平移,缩放和旋转不变性,较前馈…...

VisionPro - 基础 - 00 模板匹配技术和在VP中的使用 - PMAlign - PatMax - (上)

前言 模板匹配是机器视觉领域,尤其是工业视觉领域内,自动化经常要使用的一个视觉算法应用模式。在VP里面,有几种简单的模版匹配的算子,这里大致介绍一下VP的PatMax。 在视觉应用领域,搜索匹配的特征是经常要用到的方…...

容器镜像同步工具image-migrator

1 概述 image-migrator是一个用于容器镜像同步的可执行二进制命令行工具(不依赖于docker命令),能够自动将基于Docker Registry v2镜像仓库(registry、云厂商容器镜像服务、docker hub、Quay、Harbor )中的镜像迁移到基…...

嵌入式系统中的u-boot、kernel、rootfs的区别与关系

嵌入式系统中的u-boot、kernel、rootfs的区别与关系 1. 总览 在嵌入式Linux系统中,软件架构通常分为四个层次,从低到高依次为: 引导加载程序 (Bootloader):固化在硬件Flash中的引导代码,用于硬件基本配置和内核引导…...

K8s1.28 部署Dashboard获取登录信息

Kubernetes Dashboard 是一个基于 Web 的用户界面,用户可以通过它管理和监控 Kubernetes 集群。它提供了对容器化应用程序的概览、集群资源的状态查看、以及对服务和容器的简单操作管理。 配置 Dashboard 访问的方式: Kubernetes 中的服务类型默认是 C…...

智能化大数据平台引领企业迈向精准决策时代

随着科技的飞速发展,大数据平台正逐步迈向更加智能化和自动化的未来趋势。未来的数据平台不仅仅是一个简单的存储和处理数据的工具,而是一个能够自主学习、优化和做出决策的智能系统。这一转变将极大地改变企业处理数据的方式,提高决策的速度…...

1.3 计算机网络的分类

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型,本章从分布…...

深入剖析protobuf.js之Field类:内部机制、使用实践与高级应用指南

引言 在protobuf.js库中,Field类扮演着极其重要的角色,它定义了消息(Message)中每个字段的元数据和行为。Field类不仅包含字段的类型、编号、规则等基本信息,还负责字段的序列化和反序列化逻辑。本文将对protobuf.js的…...

docker挂载宿主机文件run命令启动报错

背景 使用docker安装mysql8,docker run 命令提示报错 命令: docker run -d \ -p 3306:3306 \ -v ~/docker/mysql8/log/mysqld.log:/var/log/mysqld.log \ -e MYSQL_ROOT_PASSWORD=123456 \ --name mysql8 mysql:8.0.36 报错信息 docker: Error response from daemon: fai…...

Python实现 Socket.IO 的在线游戏场景

博客:Python 实现 Socket.IO 的在线游戏场景 目录 引言 什么是 Socket.IO?Socket.IO 的应用场景Socket.IO 在在线游戏中的优势本文案例概述 Socket.IO 的工作原理 Socket.IO 的事件驱动机制WebSocket 与 Socket.IO 的比较Socket.IO 的握手和连接机制 …...

A+B P1001 A+B Problem

P1001 AB Problem #include <bits/stdc.h> using namespace std; int main(){int a,b;std::cin>>a>>b;std::cout<<ab; }...

git编译安装报错

编译安装步骤 卸载旧的 yum -y remove gitcd /usr/local/src/wget https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.xztar -vxf git-2.15.1.tar.xzcd git-2.15.1make prefix/usr/local/git allmake prefix/usr/local/git installecho "export PATH$PATH:/usr…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...