一起学JVM(GC可视化工具Visual GC)

article/2025/10/10 18:24:47

导读

  • 众所周知,JVM(java虚拟机)运行着我们的java程序。java本身提供了自带工具VisualVM来帮助我们查看JVM的运行情况,下面主要介绍GC的可视化插件-Visual GC

java版本

  • 1.8.0_281

工具

  • VisualVM 的 Visual GC 插件
    在这里插入图片描述

面板解读

space 空间模块

  • Space — 空间主要描述空间的变化
    • Metaspace —  元空间
    • Old — 老年代
    • Eden — 伊甸园区
    • S0 — 存活0区
    • S1 — 存活1区

方框区:所占空间大小
空白区:未使用空间
颜色区:已使用空间

Graphs 曲线图模块

  • Graphs — 曲线图主要描述时间轴上,的空间变化
    • Compile Time — ☆类型☆:编译时长曲线图
      • compiles —  单位:当前编译累计次数(次)
      • ms- 单位:当前编译花费累计时长(毫秒)
    • Class Loader Time — ☆类型☆:类加载时长
      • loaded — 单位:当前累计已加载个数(个)
      • unloaded — 单位:当前未加载个数(个)
      • ms- 单位:当前类加载累计花费时长(毫秒)
    • GC Time — ☆类型☆:垃圾回收时长曲线图
      • collections — 单位:当前垃圾回收累计次数(次)
      • Last Cause:CMS Initial Mark — 最近GC原因:CMS回收初始标记
      • Eden Space — ☆类型☆:伊甸园区时长曲线图
        • (v1, v2): v3 — v1:最大分配内存(M) v2:初始分配内存(M) v3:当前占用内存(M)
        • collections — 单位:当前GC累计次数(次)
        • ms- 单位:当前GC累计花费时长(毫秒)
      • Survivor 0 — ☆类型☆:存活0区时长曲线图
        • (v1, v2): v3 — v1:最大分配内存(M) v2:初始分配内存(M) v3:当前占用内存(M)
      • Survivor 1 — ☆类型☆:存活1区时长曲线图
        • (v1, v2): v3 — v1:最大分配内存(M) v2:初始分配内存(M) v3:当前占用内存(M)
      • Old Gen — ☆类型☆:老年区时长曲线图
        • (v1, v2): v3 — v1:最大分配内存(M) v2:初始分配内存(M) v3:当前占用内存(M)
        • collections — 单位:当前GC累计次数(次)
        • ms- 单位:当前GC累计花费时长(毫秒)
      • Metaspace — ☆类型☆:元空间时长曲线图
        • (v1, v2): v3 — v1:最大分配内存(M) v2:初始分配内存(M) v3:当前占用内存(M)

Histogram 矩形图模块

  • Histogram — 矩形图
    • Parameters — 参数
      • Tenuring Threshold —  晋升阈值,达到该阈值则从新生代进入老年代 单位:新生代GC后存活次数
      • Max Tenuring Threshold — 最大晋升阈值 单位:新生代GC后存活次数
      • Desired Survivor Size — 期望存活空间大小,是当前存活空间大小的一半 单位:bytes
      • Current Survivor Size — 当前存活空间大小 单位:bytes
    • Histogram 0-15 — 例如1:新生代GC过1次的对象

最大15次新生代GC的原因是:对象的对象头(object header)中markword区域的GC标记信息(分代年龄)占4bit,也就是15

安装 Visual GC

  • 打开 VisualVM

linux终端执行下面的命令行

jvsualvm
  • 进入 VisualVM
  • 导航栏 -> 工具 ->  插件
    在这里插入图片描述

在线安装

  • 可用插件 ->  Visual GC  ->  安装
    在这里插入图片描述
  • 下一步
    在这里插入图片描述
  • 我接受 ->  安装
    在这里插入图片描述
  • 由于需要翻墙,所以此安装方式失败,会报错,所以请参考下面的离线安装方式。
    在这里插入图片描述

离线安装

  • 访问visualVM官网  ->  Download

  • https://visualvm.github.io/index.html
    在这里插入图片描述

  • plugins offline
    在这里插入图片描述

  • 回到 VisualVM  查看JDK版本

  • 导航栏 ->  帮助 ->  关于
    在这里插入图片描述

  • 详细信息
    在这里插入图片描述

  • 关键信息:1.8.0_281 和 8u131
    在这里插入图片描述

  • 回到下载页面 131-291  和 8u131 来确定下载版本
    在这里插入图片描述

  • 点击 Visual GC  进行下载
    在这里插入图片描述

  • 下载插件文件完毕
    在这里插入图片描述

  • 回到 VisualVM

  • 导航栏 -> 工具 ->  插件 -> 已下载 ->  添加插件 -> 插件下载本地路径 ->  确定  
    在这里插入图片描述

  • 勾选 Visual GC -> 安装 ->  下一步
    在这里插入图片描述

  • 插件安装成功!
    在这里插入图片描述

  • 已安装(1)
    在这里插入图片描述

  • 重启 VisualVM  插件就生效啦!

idea 安装 visualVM Launcher

  • idea导航栏 -> File -> Plugins -> Marketplace -> VisualVM Launcher
    在这里插入图片描述
  • Other Settings -> VisualVM Launcher -> 选择jdk的jvisualvm的目录
    在这里插入图片描述

使用

  • 运行以下java代码来查看GC情况
package zhai.jvm;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;/*** -Xms10m -Xmx10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails*/
public class TestJVM {byte[] data = new byte[1024*100];public static void main(String[] args) throws InterruptedException {List<TestJVM> list = new ArrayList<>();while (true) {list.add(new TestJVM());TimeUnit.SECONDS.sleep(1);}}
}
  • 代码解读

一个死循环,每隔1s,往集合内放入一个1K大小的数据。

  • jvm参数解读

-Xms 设置初始化内存
-Xmx 设置最大分配内存
-XX:+UseConcMarkSweepGC 使用CMS GC
-XX:+PrintGCDateStamps 打印GC 时间戳
-XX:+PrintGCDetails 打印GC详情

  • idea配置jvm参数

  • Edit Configurations
    在这里插入图片描述
    在这里插入图片描述

  • 运行项目
    在这里插入图片描述

  • 打开 VisualVM 选择本地运行的java程序 -> Visual GC
    在这里插入图片描述

  • 观察 Visual GC

随着时间的推移,对象不断的从新生代被转移到老年代,并且不能被Full CG,最后先导致老年代满了,然后很快新生代也满了,导致系统报错 OutOfMemoryError: Java heap space

Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat zhai.jvm.TestJVM.<init>(TestJVM.java:11)at zhai.jvm.TestJVM.main(TestJVM.java:16)

最后

  • 通过可视化工具Visual GC,来帮助我们观察堆内存的运行情况,配置JVM参数,反复测试来达解决内存泄露问题,降低GC次数,提高系统的稳定性。

http://chatgpt.dhexx.cn/article/D5249ETJ.shtml

相关文章

JVM G1详解

java程序性能 当我们调优java程序时&#xff0c;通常的目标有两个&#xff1a; 响应能力 或者 吞吐量 响应能力 响应能力指一个程序或者系统对请求的是否能够及时响应。 比如&#xff1a; 一个桌面UI能多快的响应一个事件&#xff1b; 一个网站能够多快返回一个页面请求&…

最简单的JVM内存结构图

目录 JVM内存结构图 方法区 堆 栈 程序计数器 本地方法栈 直接内存 内存分配性能优化-逃逸分析 总结 JVM内存结构图 大家好&#xff0c;好几天没有更新了&#xff0c;今天的内容有点多&#xff0c;我们详细介绍下JVM内部结构图&#xff0c;还是和之前一样&#xff0c;案…

JVM进阶(十一):JAVA G1收集器

文章目录 一、前言 一、前言 G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家庭中&#xff0c;成为HotSpot重点发展的垃圾回收技术。同优秀的CMS垃圾回收器一样&#xff0c;G1也是关注最小时延的垃圾回收器&#xff0c;也同…

JVM监控之图形化工具

一、工具概述 使用命令行工具存在以下的局限性&#xff1a; 无法获取方法级别的分析数据&#xff0c;如方法之间的调用关系、各方法的调用次数和调用时间等要去用户登陆到java应用所在的宿主机上分析数据通过终端输出&#xff0c;结构不够直观 随着java应用的官方使用&#…

Java 知识结构图

简介 《 值得去的地方&#xff0c;没有捷径&#xff1b;难走的路才更值得开始 》 为什么要说这个【知识结构图】呢&#xff0c;其实是针对于刚开始学习&#xff0c;工作或工作一段时间的人&#xff0c;每天忙&#xff0c;杂七杂八&#xff0c;自己身心巨累&#xff0c;又想要偷…

Java程序员必备基础结构图

前言 最近看了深入理解Java虚拟机第三版&#xff0c;整理了一些基础结构图&#xff0c;算是比较全的了&#xff0c;做一下笔记&#xff0c;大家一起学习。 1.Java虚拟机运行时数据区图 JVM内存结构是Java程序员必须掌握的基础。 程序计数器 程序计数器&#xff0c;可以看作…

JVM 结构图

一&#xff1a;Java技术体系模块图 二&#xff1a;JVM内存区域模型 1.方法区 也称"永久代” 、“非堆”&#xff0c; 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB&#xff0c;最大值为64MB&#xff0c;可以通过-XX:Per…

JVM结构、GC工作机制详解

题外话&#xff1a;最近在应聘阿里2015暑期实习&#xff0c;感触颇多。机会总是留给有准备的人的&#xff0c;所以平常一定要注意知识的巩固和积累。知识的深度也要有一定的理解&#xff0c;不比别人知道的多&#xff0c;公司干嘛选你&#xff1f;关于JVM和GC&#xff0c;我相信…

详解 JVM Garbage First(G1) 垃圾收集器

前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估。本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比;然后通过G1的内存模型、G1…

【JVM】JVM内存结构之——G1收集器

目录 1. 什么是G12. G1收集器发展历程3. G1收集器分区划分3.1 为什么G1收集器需要设计巨型对象3.2 G1收集器参数设置 3.3 G1收集器回收的细节3.4 G1收集器Rset问题&#xff08;记忆集&#xff09;3.5 G1两种回收策略4. G1收集器优缺点 5. G1收集器核心配置参数 1. 什么是G1 G1…

Visual Studio C# WinForm开发入门(5):TabControl 控件使用

TabContrl选项卡控件可创建标签化窗口&#xff0c;在实际 编程中经常用到&#xff0c;该控件的作用是将相关的组件组合到一系列选项卡页面上。 比如下面的例子&#xff0c;在tabPage1页面和tabPage2页面各放了2个checkBox控件&#xff0c;通过点击不同page即可切换&#xff1a;…

WPF自定义TabControl样式

WPF自定义TabControl样式 原文: WPF自定义TabControl样式 WPF自定义TabControl&#xff0c;TabControl美化 XAML代码&#xff1a; <TabControl x:Class"SunCreate.Common.Controls.TabControlEx"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/present…

C# WinForm TabControl美化

窗口Load加下面代码&#xff0c;ItemSize根据自己显示文本长度调整 #region tabMainItem属性设置this.tabModuleMainItem.DrawMode TabDrawMode.OwnerDrawFixed;this.tabModuleMainItem.Alignment TabAlignment.Top;this.tabModuleMainItem.SizeMode TabSizeMode.Fixed;this…

浅谈C#tabcontrol应用

作为Winfrom开发者来说&#xff0c;我们很多时候会用到tabcontrol来实现和网页标签页相关的效果。同时微软自带的控件样式不符合我们的需求&#xff0c;我们该如何去实现更加美观且可以自定义的组合控件呢&#xff1f;带着这个问题进入我们今天的主题&#xff0c;组合控件tabco…

C# WPF TabControl控件用法详解

概述 TabControl我之前有讲过一节&#xff0c;内容详见&#xff1a; C# WPF TabControl用法指南(精品)&#xff0c;上节主要讲解了tabcontrol控件的左右翻页&#xff0c;以及页面筛选&#xff0c;以及数据绑定等内容&#xff0c;这节内容继续接续上节内容进行扩展讲解&#xff…

WPF 自定义控件TabControl

WPF 自定义控件TabControl 新TabControl效果&#xff1a; 新添加一个自定义控件ZTabControl&#xff1a; public class ZTabControl : TabControl{#region Private属性#endregion#region 依赖属性定义public static readonly DependencyProperty TypeProperty;#endregion#r…

Winform TabControl标签美化

前期工作&#xff1a; 加载资源文件&#xff0c;双击“Resources.resx" 类型选择Images 【添加资源】——【添加现有文件】 选择需要添加的图片文件&#xff0c;保存即可。 在下面的资源文件夹中即可看到添加的图片列表 **方法一&#xff1a;**重绘标签及背景 新建窗体…

WPF 自定义TabControl控件样式(转)

WPF 自定义TabControl控件样式 一、前言 程序中经常会用到TabControl控件&#xff0c;默认的控件样式很普通。而且样式或功能不一定符合我们的要求。比如&#xff1a;我们需要TabControl的标题能够居中、或平均分布&#xff1b;或者我们希望TabControl的标题能够进行关闭。要…

WPF TabControl 数据绑定

WPF TabControl in Binding’s world 首先&#xff0c;TabControl是间接继承自ItemControl的控件&#xff0c;因此可以像ItemControl那样自如的使用。 自此&#xff0c;我们知道了ItemControl的派生控件有&#xff1a; ItemControl–>Selector–>ListBox ItemControl…

WPF TabControl Styles

WPF TabControl Styles 水平使用的TabControl 效果&#xff1a; 样式资源 <!-- 顶部TabControl控件样式 --><SolidColorBrush x:Key"TabItem.Static.Background" Color"White"/><SolidColorBrush x:Key"TabItem.Static.Border&quo…