【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 8179

Attaching to process ID 8179, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14

using thread-local object allocation.
Garbage-First (G1) GC with 18 thread(s)

Heap Configuration: #堆内存初始化配置
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 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 MB
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 512
   capacity = 536870912 (512.0MB)
   used     = 347981816 (331.86132049560547MB)
   free     = 188889096 (180.13867950439453MB)
   64.81666415929794% used
G1 Young Generation:
Eden Space:
   regions  = 265
   capacity = 304087040 (290.0MB)
   used     = 277872640 (265.0MB)
   free     = 26214400 (25.0MB)
   91.37931034482759% used
Survivor Space:
   regions  = 33
   capacity = 34603008 (33.0MB)
   used     = 34603008 (33.0MB)
   free     = 0 (0.0MB)
   100.0% used 

G1 Old Generation:
   regions  = 35
   capacity = 198180864 (189.0MB)
   used     = 35506168 (33.86132049560547MB)
   free     = 162674696 (155.13867950439453MB)
   17.916042590267445% used

30742 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  [C
   2:         90345        2168280  java.lang.String
   3:         57918        1853376  java.util.concurrent.ConcurrentHashMap$Node
   4:         15970        1758272  java.lang.Class
   5:          5369        1673712  [B
   6:         16297        1434136  java.lang.reflect.Method
   7:         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

 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/536087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果 一、简单介绍 二、简单视频浮雕画效果实现原理 三、简单视频浮雕画效果…

关于MCU产品开发参数存储的几种方案

关于MCU产品开发参数存储的几种方案 Chapter1 关于MCU产品开发参数存储的几种方案Chapter2 单片机参数处理[保存与读取]Chapter3 嵌入式设备参数存储技巧Chapter4 STM32硬件I2C的一点心得(AT24C32C和AT24C64C) Chapter1 关于MCU产品开发参数存储的几种方案 原文链接 在工作中…

Python 批量检测ip地址连通性,以json格式显示(支持传参单IP或者网段)

代码 ########################################################################## File Name: check_ip_test.py# Author: eight# Mail: 18847097110163.com # Created Time: Thu 11 Apr 2024 08:52:45 AM CST################################################…

突破界限 千视将在 NAB 2024 展会上展示领先的 AV over IP 技术

突破界限&#xff01;千视将在 NAB 2024 展会上展示领先的 AV over IP技术 作为AV over IP领域的先驱者&#xff0c;Kiloview将于2024年4月14日至17日在NAB展会&#xff08;展台号&#xff1a;SU6029&#xff09;隆重登场&#xff0c;展示我们领先业界的AV over IP产品、解决方…

Windows下安装GPU版Pytorch

升级Driver到最新版本 Windows搜索栏中输入设备管理器找到显示适配器一项&#xff0c;点击展开&#xff0c;你将看到你的NVIDIA显卡列在其中右键点击你的NVIDIA显卡&#xff0c;选择更新驱动软件…。在弹出的对话框中&#xff0c;选择自动搜索更新的驱动软件。之后&#xff0c…

nginx反向代理conf

打开nginx配置。 对登录功能测试完毕后&#xff0c;接下来&#xff0c;我们思考一个问题&#xff1a;前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f; 前端请求地址&#xff1a;http://localhost/api/employee/login 后端接口地址&#xff1a;http://localho…

计算机网络——NAT技术

目录 前言 前篇 引言 SNAT&#xff08;Source Network Address Translation&#xff09;源网络地址转换 SNAT流程 确定性标记 DNAT&#xff08;Destination Network Address Translation&#xff0c;目标网络地址转换&#xff09; NAT技术重要性 前言 本博客是博主用于…

ShardingSphere再回首

概念&#xff1a; 连接&#xff1a;通过协议 方言及库存储的适配&#xff0c;连接数据和应用&#xff0c;关注多模数据苦之间的合作 增量&#xff1a;抓取库入口流量题提供重定向&#xff0c; 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等 可插拔&#xff1a;微内核 DDL:cr…

ssm+vue的实验室课程管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的实验室课程管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

来补上LangChain的CookBook(二)

LangChain Experssion Language 简称LCEL&#xff0c;感觉就是为了节省代码量&#xff0c;让程序猿们更好地搭建基于大语言模型的应用&#xff0c;而在LangChain框架中整了新的语法来搭建promptLLM的chain。来&#xff0c;大家直接看官网链接&#xff1a;LangChain Expression …

pandas(day10)

一. 各各品类产品交易指数对比 获取文件名 files glob.glob("./*.xlsx")# 读取数据&#xff0c;并改列名&#xff0c;增加一列 品牌 dfs [] for f in files:t f[2:4]df pd.read_excel(f)df["品牌"] tif t "拜耳":df.rename(columns{"…

C语言读取 .ico 文件并显示数据

原来是想做光标编辑器&#xff0c;自己把绘图板的内容导出为光标格式 鼠标指针文件格式解析——Windows&#xff08;一&#xff09; (qq.com) 代码来源自 Icons | Microsoft Learn 鄙人又补充些变量可以运行微软的代码 简单代码如下 #include <stdio.h> #include &l…

uniapp 小程序获取WiFi列表

<template><view ><button click"getWifiList">获取WiFi列表</button><scroll-view:scroll-top"scrollTop"scroll-yclass"content-pop"><viewclass"itemInfo"v-for"(item, index) in wifiList&…

unity——Button组件单击双击长按功能

1.实现单击、双击、长按功能 using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class ButtonControl_Click_Press_Double : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler {publi…

debian安装和基本使用

debian安装和基本使用 文章目录 debian安装和基本使用1. 为什么选择debian2. 如何下载Debian2.1 小型安装镜像2.2 完整安装镜像 3. Debian操作系统安装3.1 创建Debian虚拟机3.2 安装操作系统 4. Debian系统的初始设置4.1 桌面环境的配置4.2 配置网络4.3 生效网络配置4.4 配置de…

第24次修改了可删除可持久保存的前端html备忘录:文本编辑框不再隐藏,又增加了哔哩哔哩搜索和必应搜索

第24次修改了可删除可持久保存的前端html备忘录:文本编辑框不再隐藏&#xff0c;又增加了哔哩哔哩搜索和必应搜索. <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"…

Python学习之-matplotlib详解

前言&#xff1a; Matplotlib 是一个 Python 的图表绘制库&#xff0c;广泛用于生成各种静态、动态和交互式的图表。它能够创建线图、散点图、条形图、饼图、直方图、误差线图、箱型图、热图、子图网络、散点矩阵等图表。 安装 Matplotlib&#xff1a; pip install matplotli…

RocketMQ的docker安装和SpringBoot的集成

1.Docker安装 1.1创建docker-compose.yml文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports:- 9876:9876networks:rmq:aliases:- rmqnamesrvrmqbroker:image: foxiswho/rocketmq:brokercontainer_name: rmqbrokerports…

docker完美安装分布式任务调度平台XXL-JOB

分布式任务调度平台XXL-JOB 1、官方文档 自己看 https://www.xuxueli.com/xxl-job/#1.1%20%E6%A6%82%E8%BF%B0 2、使用docker部署 本人使用的腾讯云&#xff0c;安装docker暴露一下端口&#xff0c;就很舒服的安装这个服务了。 docker pull xuxueli/xxl-job-admin:2.4.03…

ELFK的部署

目录 一、ELFK&#xff08;FilebeatELK&#xff09; 1. Filebeat的作用 2. ELFK工作流程 3. ELFK的部署 3.1 服务器配置 3.2 服务器环境 3.3 安装filebeat 3.4 修改filebeat主配置文件 3.5 在logstash组件所在节点&#xff08;apache节点&#xff09;上新建一个logstas…