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

【JVM】JVM堆占用情况分析(频繁创建的对象、内存泄露等问题)、jmap+jhat、jvisualvm工具使用

文章目录

  • 一. 相关命令
    • 1. 查看进程堆内存整体使用情况:OOM的可能
    • 2. 统计类的对象数量以及内存占用:定位内存泄漏
  • 二. 分析内存占用
    • 1. 使用 jhat 排查对象堆占用情况
      • 1.1. 排查步骤
      • 1.2. 具体分析例子
        • a. 分析频繁创建对象导致的OOM
      • 1.3. OQL查看某一个对象的引用情况
    • 2. 使用jvisualvm
    • 3. MAT分析ing

本文讲解如何生成堆存储文件,并分析堆文件中异常的大对象,及其相关调用链等,可以定位出内存泄露、内存溢出等问题。

本文关键词:

分析工具:jmap+jhat、jmap+jvisualvm、jmap+MAT
分析关键词:大对象(内存占用整体进程高)、对象数量高

一. 相关命令

1. 查看进程堆内存整体使用情况:OOM的可能

jmap -heap 8179Attaching to process ID 8179, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14using thread-local object allocation.
Garbage-First (G1) GC with 18 thread(s)Heap Configuration: #堆内存初始化配置MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 536870912 (512.0MB)NewSize                  = 1363144 (1.2999954223632812MB)MaxNewSize               = 321912832 (307.0MB)OldSize                  = 5452592 (5.1999969482421875MB)NewRatio                 = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率SurvivorRatio            = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 1048576 (1.0MB)Heap Usage:
G1 Heap:regions  = 512capacity = 536870912 (512.0MB)used     = 347981816 (331.86132049560547MB)free     = 188889096 (180.13867950439453MB)64.81666415929794% used
G1 Young Generation:
Eden Space:regions  = 265capacity = 304087040 (290.0MB)used     = 277872640 (265.0MB)free     = 26214400 (25.0MB)91.37931034482759% used
Survivor Space:regions  = 33capacity = 34603008 (33.0MB)used     = 34603008 (33.0MB)free     = 0 (0.0MB)100.0% used G1 Old Generation:regions  = 35capacity = 198180864 (189.0MB)used     = 35506168 (33.86132049560547MB)free     = 162674696 (155.13867950439453MB)17.916042590267445% used30742 interned Strings occupying 3947896 bytes.

这里看到Survivor Space(幸存者空间)已经被100.0%使用

这可能意味着您的应用程序正在生成大量临时对象,并且这些对象在经过年轻代垃圾回收后仍然存活。这种情况可能导致频繁的垃圾回收和性能问题。如下建议:

  1. 减少临时对象创建:尽量减少创建临时对象的次数,避免不必要的对象分配。
  2. 检查对象存活时间:确保对象不会在幸存者空间中存活时间过长,及时释放不再需要的对象。
  3. 调整JVM参数:如增加幸存者空间的大小(通过调整-XX:SurvivorRatio参数),以容纳更多的存活对象。

 

2. 统计类的对象数量以及内存占用:定位内存泄漏

## 查看活着的对象
jmap -histo:live 8179 num     #instances         #bytes  class name
----------------------------------------------1:         92285       14964792  [C2:         90345        2168280  java.lang.String3:         57918        1853376  java.util.concurrent.ConcurrentHashMap$Node4:         15970        1758272  java.lang.Class5:          5369        1673712  [B6:         16297        1434136  java.lang.reflect.Method7:         25573        1432088  java.util.LinkedHashMap
...6217:             1             16  sun.util.locale.provider.SPILocaleProviderAdapter
6218:             1             16  sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
6219:             1             16  sun.util.resources.LocaleData
6220:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total        700466       41856208

针对每个占用大量内存的对象,分析其引用链,即它所引用的其他对象和被其他对象引用的情况。这有助于确定对象何时被创建,以及是否有引用导致它们不能被垃圾回收。

 

二. 分析内存占用

1. 使用 jhat 排查对象堆占用情况

1.1. 排查步骤

第一步:导出堆文件


jmap -dump:file=<file_name> <pid>

 
第二步:分析堆文件

生成文件后执行

jhat heap_dump.hprof 
Reading from heap_dump.hprof...
Dump file created Mon Mar 05 18:33:10 CST 2024
Snapshot read, resolving...
Resolving 751016 objects...
Chasing references, expect 150 dots......................................................................................................................................................
Eliminating duplicate references......................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

 

第三步:查看html

访问:http://hostname:7000

在这里插入图片描述

对于jhat启动后显示的html页面中功能:

  1. 显示出堆中所包含的所有的类
  2. 从根集能引用到的对象
  3. 显示平台包括的所有类的实例数量
  4. 显示平台外的所有对象信息
  5. 堆实例的分布表(堆直方图)
  6. 执行对象查询语句

 

一般查看堆异常情况主要看这个两个部分

在页面的最下面中的Other Queries里的两个链接中进入。

在这里插入图片描述

  • Show instance counts for all classes (excluding platform),平台外的所有对象信息

在这里插入图片描述

  • Show heap histogram 以树状图形式展示堆情况

在这里插入图片描述

 

1.2. 具体分析例子

a. 分析频繁创建对象导致的OOM

在这里插入图片描述

可以看到bson相关有几十万个实例,alarmMessage有十几万个实例,也就是说alarmMessage被频繁创建。接着分析:

bson.document类是mongodb的相关类,现在需要排查,mongoldb,看是否有alarmmessage实体相关的请求挤压。
经查,有个接口请求大量数据,超过20万条,并且请求非常频繁,导致内存溢出。修改该接口后,问题解决。

 

1.3. OQL查看某一个对象的引用情况

对于大对象排查内存溢出的可能,我们打开OQL窗口看对象中的value是否为null,执行如下OQL语句

select  u from com.webank.wedatasphere.linkis.common.ServiceInstance u  where (u.value = null)

如果当value=null时,仍然有强引用存在,此时gc是不能回收的,这样就会出现内存的溢出问题。

 

如下图,我们可以点击查看某个对象,可以看到如下成员变量、引用的对象、其他弱引用。

在这里插入图片描述
在这里插入图片描述

更多关于对象查询语言可参考:jhat中的OQL(对象查询语言)

 

2. 使用jvisualvm

VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的).
官网上关于jvisualvm的用法介绍

在mac控制台下输入

jvisualvm

装入快照
在这里插入图片描述

 

分析:对象数与堆占用
在这里插入图片描述

 

查看对象被引用的关系
在这里插入图片描述

 

3. MAT分析ing

可参考:https://gitcode.csdn.net/65e6e3871a836825ed786d51.html

 
 

相关文章:

【JVM】JVM堆占用情况分析(频繁创建的对象、内存泄露等问题)、jmap+jhat、jvisualvm工具使用

文章目录 一. 相关命令1. 查看进程堆内存整体使用情况&#xff1a;OOM的可能2. 统计类的对象数量以及内存占用&#xff1a;定位内存泄漏 二. 分析内存占用1. 使用 jhat 排查对象堆占用情况1.1. 排查步骤1.2. 具体分析例子a. 分析频繁创建对象导致的OOM 1.3. OQL查看某一个对象的…...

【蓝桥杯每日一题】4.11 更小的数(不用区间DP)

题目来源&#xff1a; 蓝桥杯 2023 省 A]更小的数 - 洛谷 这题只需要用到双指针就OK~ 思路1&#xff1a; 翻转数组的子数组&#xff0c;然后进行比较大小将翻转后的数组存储在字符串 k k k中&#xff0c;然后将字符串 k k k与字符串 a a a进行逐一元素比较&#xff08;因为…...

【线段树】2276. 统计区间中的整数数目

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…...

ChatGPT 写作利器:探索ChatGPT在论文写作中的应用

ChatGPT无限次数:点击直达 ChatGPT 写作利器&#xff1a;探索ChatGPT在论文写作中的应用 引言 ChatGPT是一种强大的自然语言处理工具&#xff0c;能够为我们提供高效、准确的文本生成功能。在论文写作领域&#xff0c;ChatGPT的应用也逐渐受到关注。本文将探讨ChatGPT在论文写…...

从 SQLite 3.4.2 迁移到 3.5.0(二十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite---调试提示&#xff08;十九&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ SQLite 版本 3.5.0 &#xff08;2007-09-04&#xff09; 引入了一个新的操作系统接口层&#xff0c; 与所有先前版本的 SQLi…...

集群开发学习(一)(安装GO和MySQL,K8S基础概念)

完成gin小任务 参考文档&#xff1a; https://www.kancloud.cn/jiajunxi/ginweb100/1801414 https://github.com/hanjialeOK/going 最终代码地址&#xff1a;https://github.com/qinliangql/gin_mini_test.git 学习 1.安装go wget https://dl.google.com/go/go1.20.2.linu…...

[Kubernetes[K8S]集群:Slaver从节点初始化和Join]:添加到主节点集群内

文章目录 操作流程&#xff1a;上篇主节初始化地址&#xff1a;前置&#xff1a;Docker和K8S安装版本匹配查看0.1&#xff1a;安装指定docker版本 **[1 — 8] ** [ 这些步骤主从节点前置操作一样的 ]一&#xff1a;主节点操作 查看主机域名->编辑域名->域名配置二&#x…...

redis复习笔记08(小滴课堂)

案例实战需求之大数据下的用户画像标签去重 我们就简单的做到了去重了。 案例实战社交应用里面之关注、粉丝、共同好友案例 这就是我们set的一个应用。 案例实战之SortedSet用户积分实时榜单最佳实践 准备积分类对象&#xff1a; 我们加上构造方法和判断相等的equals和hascod…...

在线课程平台LearnDash评测 – 最佳 WordPress LMS插件

在我的LearnDash评测中&#xff0c;我探索了流行的 WordPress LMS 插件&#xff0c;该插件以其用户友好的拖放课程构建器而闻名。我深入研究了各种功能&#xff0c;包括课程创建、测验、作业、滴灌内容、焦点模式、报告、分析和管理工具。 我的评测还讨论了套餐和定价选项&…...

OpenDDS-3.27构建与用法

一、OpenDDS-3.27构建 ./configure To enable Java bindings, use ./configure --java make 二、运行Messenger Example&#xff1a; source setenv.sh For the C example&#xff1a;cd DevGuideExamples/DCPS/Messenger For the Java example&#xff1a;cd java/tests/mes…...

计算机网络——MAC地址和IP地址

目录 前言 引入 MAC地址与IP地址 IP地址和MAC地址是什么&#xff1f;如何起作用的&#xff1f; MAC地址如何表示与确定网卡在网络中的确定位置&#xff1f; DHCP协议自动帮我们配置 操作系统是如何知道对方的MAC地址的&#xff1f; 前言 本博客是博主用于复习计算机网络…...

Unity构建详解(7)——AssetBundle格式解析

【文件格式】 文件可以分为文本文件、图片文件、音频文件、视频文件等等&#xff0c;我们常见的这些文件都有行业内的标准格式&#xff0c;其意味着按照一定的规则和规范去保存读取文件&#xff0c;可以获取我们想要的数据。 有些软件会有自己的文件格式&#xff0c;会按照其…...

前端对接fastGPT流式数据+打字机效果

首先在对接api时 参数要设置stream: true, const data {chatId: abc,stream: true,//这里true返回流式数据detail: false,variables: {uid: sfdsdf,name: zhaoyunyao,},messages: [{ content: text, role: user }]}; 不要用axios发请求 不然处理不了流式数据 我这里使用fetch …...

避免使用第三方工具完成电脑环境检测

0. 简介 在之前配置各种深度学习环境的时候经常需要先检测一下电脑的软硬件环境&#xff0c;其实整个过程比较重复和固定&#xff0c;所以我们是否有可能一键检测Python版本、PIP版本、Conda版本、CUDA版本、电脑系统、CPU核数、CPU频率、内存、硬盘等内容这是很多Deepper苦恼…...

vue 中 mixin 的应用场景,原理和合并规则

应用场景 多个组件的相同逻辑可以提出去来一个公共的 mixin 原理 Mixin 的工作原理是将 Mixin 中的选项合并到组件的选项中 合并规则 优先处理 mixinsprops 、method、inject、computed 同名的使用组件内的&#xff0c;不使用mixin 的data 进行合并生命周期和watch 先执行…...

点击按钮(文字)调起elementUI大图预览

时隔一年&#xff0c;我又回来了 ~ 最近在做后台&#xff0c;遇到一个需求&#xff0c;就是点击“查看详情”按钮&#xff0c;调起elementUI的大图预览功能&#xff0c;预览多张图片&#xff0c;如下图&#xff1a; 首先想到的是使用element-ui的el-image组件&#xff0c;但它是…...

全面学习SpringCloud框架指南

要深入学习Spring Cloud框架,你需要系统地掌握其核心组件和概念,并了解如何在实际项目中应用这些知识。以下是一些关键的学习点和相应的学习内容: 一共分为10个模块包括: 1、微服务架构基础: 理解微服务架构的概念和优势。 学习单体架构向微服务架构演进的过程。 掌握…...

5G智慧水利数字孪生可视化平台,推进水利行业数字化转型

5G智慧水利数字孪生可视化平台&#xff0c;推进水利行业数字化转型。随着5G技术的快速发展&#xff0c;越来越多的行业开始探索数字化转型的道路。水利行业作为国民经济的重要支柱&#xff0c;也面临着数字化转型的迫切需求。5G智慧水利数字孪生可视化平台作为水利行业数字化转…...

新手入门:大语言模型训练指南

在这个信息爆炸的时代&#xff0c;人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能手机上的语音助手到自动驾驶汽车&#xff0c;AI的应用无处不在。而在这些令人惊叹的技术背后&#xff0c;大语言模型&#xff08;LLM&#xff09;扮演着至关重要的角色。它们不…...

Win11 WSL2 install Ubuntu20.04 and Seismic Unix

Win11系统&#xff0c;先启用或关闭Windows功能&#xff0c;勾选“适用于Linux的Windows子系统”和“虚拟机平台”两项 设置wsl默认版本为wsl2&#xff0c;并更新 wsl --list --verbose # 查看安装版本及内容 wsl --set-default-version 2 # 设置wsl默认版本为wsl2 # 已安装…...

rust使用print控制台打印输出五颜六色的彩色红色字体

想要在控制台打印输出彩色的字体&#xff0c;可以使用一些已经封装好的依赖库&#xff0c;比如ansi_term这个依赖库&#xff0c;官方依赖库地址&#xff1a;https://crates.io/crates/ansi_term 安装依赖&#xff1a; cargo add ansi_term 或者在Cargo.toml文件中加入&#…...

贪心算法|435.无重叠区间

力扣题目链接 class Solution { public:// 按照区间右边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.siz…...

C++的并发世界(七)——互斥锁

0.死锁的由来 假设有两个线程T1和T2&#xff0c;它们需要对两个互斥量mtx1和mtx2进行访问。而且需要按照以下顺序获取互斥量的所有权&#xff1a; -T1先获取mte1的所有权,再获取mt2的所有权。 -T2先获取 mtx2的所有权。再铁取 mtx1的所有权。 如果两个线程同时执行&#xff0c…...

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时&#xff0c;见不到 DAQmx&#xff0c;或者在Express中见不到DAQ助手…...

cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵

cesium调整3dtiles的位置用到的是平移矩阵&#xff0c;原理是在世界坐标系中用偏移点减去原始点得到一个平移向量&#xff0c;再根据这个向量得到平移矩阵。 原始点&#xff1a;一般是模型的中心点位置&#xff0c;可通过模型的包围盒得到偏移点&#xff1a;可分为两种情况&…...

flutter跑通腾讯云直播Demo

运行示例 前提条件 要求java jdk 11版本 并且配置到了环境变量 重要 要求flutter 版本 2.8.0 并且配置到了环境变量 重要 要求dart-sdk版本2.15 并且配置到了环境变量 重要 您已 注册腾讯云 账号&#xff0c;并完成 实名认证。 申请 SDKAPPID 和 SECRETKEY 登录实时音视频控…...

飞机降落蓝桥杯[2023蓝桥省赛B组]

2023蓝桥省赛B组 B题 飞机降落 题解 标准深搜板子题&#xff0c;难度不大 #include<bits/stdc.h> using namespace std; #define MAX 10 struct node{int t,d,l;//t:飞机到达时间 d:飞机最大盘旋时间 l:飞机降落所需时间bool v;//标记此架飞机是否被搜索过 用于剪枝 };…...

如何动态渲染HTML内容?用v-html!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

EFcore 6 连接oracle19 WinForm vs2022

用EFcore访问Oracle&#xff0c;终于不需要Oracle的什么安装包了&#xff0c;直接在VS2022中就可以轻松搞定。在csdn上看到一哥们的帖子&#xff0c;测试了一下&#xff0c;发现很方便。使用的场景是&#xff1a;VS2022中EFcore6。经过测试&#xff0c;同 Navicat Premium 16比…...

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第2节(finally代码块)

9.2 finally 代码块 ​ 还有第四个用于异常处理的关键字&#xff0c;我已经提到过&#xff0c;但到目前为止还没有使用过&#xff0c;那就是 finally。finally块用于执行一些应始终执行的操作&#xff08;通常是清理操作&#xff09;。事实上&#xff0c;无论是否发生异常&…...