前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起学JVM(GC可视化工具Visual GC)

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

作者头像
翟凤玺
发布2021-12-07 15:44:52
1K0
发布2021-12-07 15:44:52
举报
文章被收录于专栏:翟凤玺翟凤玺

导读

  • 众所周知,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终端执行下面的命令行

代码语言:javascript
复制
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情况
代码语言:javascript
复制
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

代码语言:javascript
复制
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at zhai.jvm.TestJVM.<init>(TestJVM.java:11)
	at zhai.jvm.TestJVM.main(TestJVM.java:16)

最后

  • 通过可视化工具Visual GC,来帮助我们观察堆内存的运行情况,配置JVM参数,反复测试来达解决内存泄露问题,降低GC次数,提高系统的稳定性。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • java版本
  • 工具
  • 面板解读
    • space 空间模块
      • Graphs 曲线图模块
        • Histogram 矩形图模块
        • 安装 Visual GC
          • 在线安装
            • 离线安装
            • idea 安装 visualVM Launcher
            • 使用
            • 最后
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档