当前位置: 首页 > 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…...

如何用LangChain开发一个Agent,20分钟包教包会!

26年一定是一个 Agent 大年&#xff0c;我这边持续出系列文章&#xff0c;帮助大家更好的落地 Agent&#xff0c;今天的重点是程序员最常用的 Agent 框架 LangChain。 只不过这东西可能由于 AI Coding 的成熟&#xff0c;由给人看变成给 AI 看的。 LangChain 既是一个开源的A…...

RobotStudio 仿真软件学习分享02 —— 仿真

目录一、本次学习内容总结二、学习经历&#xff08;实操操作过程&#xff09;2.1 机器人模型导入2.2 机器人工具加载与周边设备导入2.3 创建机器人控制系统2.4 创建工件坐标系&#xff08;Workobject_1&#xff09;2.5 创建并仿真机器人运动轨迹2.6 仿真视频录制三、补充关键注…...

为什么很多实时图表方案会失败?

在监控系统、IoT设备平台、金融行情等场景中&#xff0c;“实时数据可视化”已经成为前端的核心能力之一。很多开发者在 React 项目中尝试实现实时图表时&#xff0c;往往会遇到卡顿、延迟甚至内存增长的问题。在 React 中实现实时图表&#xff0c;推荐使用 Highcharts&#xf…...

使用gitee备份整个服务器数据

可以的&#xff0c;我给你说一套服务器上最标准、最稳妥的备份方案&#xff0c;专门针对你这种&#xff1a;/var/www 数据库 /etc/apache2 一起存到 Gitee 的场景。一、先说清楚&#xff1a;哪些要备份、哪些别乱备份1. 必须备份&#xff08;你的网站核心&#xff09;/var/ww…...

零基础掌握CheatEngine-DMA:游戏内存分析与修改全攻略

零基础掌握CheatEngine-DMA&#xff1a;游戏内存分析与修改全攻略 【免费下载链接】CheatEngine-DMA Cheat Engine Plugin for DMA users 项目地址: https://gitcode.com/gh_mirrors/ch/CheatEngine-DMA 传统内存修改遇到的3大痛点 当你尝试分析游戏内存或进行内存修改…...

【30】软考软件设计师——UML类图与用例图满分精讲|下午第3题常考核心

摘要:本文是《软件设计师50讲通关|从零基础到工程师职称》专栏第30篇,聚焦模块四:应用技术(下午题)第3道高频大题,UML建模是历年下午必考核心,单题分值稳定10~12分。全文深度拆解两大核心UML图表:类图与用例图,超详细讲解类图三层结构、可见性修饰符、五大核心关系(…...

免费开源音频转换工具fre:ac完整指南:跨平台多格式转换与CD抓取终极教程

免费开源音频转换工具fre:ac完整指南&#xff1a;跨平台多格式转换与CD抓取终极教程 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac fre:ac是一款功能强大的免费开源音频转换工具&#xff0c;支持Windo…...

新手福音:通过快马AI生成代码学习下拉词功能实现原理

今天想和大家分享一个特别适合前端新手练手的小项目——实现一个基础的下拉词搜索框。这个功能看似简单&#xff0c;但涵盖了事件监听、数组过滤、DOM操作等前端开发的核心概念。我自己在学习过程中发现&#xff0c;通过实际动手实现一个小功能&#xff0c;比单纯看理论要容易理…...

3分钟掌握Umi-OCR:让文字识别变得如此简单的免费离线工具

3分钟掌握Umi-OCR&#xff1a;让文字识别变得如此简单的免费离线工具 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国…...

终极无损音乐下载实战:qobuz-dl带你体验24位/96kHz高解析度音频世界

终极无损音乐下载实战&#xff1a;qobuz-dl带你体验24位/96kHz高解析度音频世界 【免费下载链接】qobuz-dl A complete Lossless and Hi-Res music downloader for Qobuz 项目地址: https://gitcode.com/gh_mirrors/qo/qobuz-dl 你是否曾梦想拥有一个完整的无损音乐库&a…...