记录一次内存泄漏追踪(一)

简介: 记录一次内存泄漏追踪(一)

一 背景

项目上线后出现jvm内存过高的情况,并且运行一段时间后会出现内存溢出。


AI 代码解读

二 分析

  1. 查看项目状态

image.png

可以看到现在使用内存已经达到了12g并且没有内存溢出,推测存在内存泄漏情况

  1. 下载jvm内存快照

    • 查看容器中的java进程pid,找到服务的pid

      jps -lv

    • 下载内存快照

      jmap -dump:format=b,file=head.bin pid

  2. 查看内存快照

    通过检查具体的内存使用情况来进一步定位问题
    
    通过visualvm来转入快照
    
    
    
    AI 代码解读

image.png

 
 
注意visualvm要调整识别文件后缀为hprof文件
AI 代码解读

image.png

 
 准入后我们可以查看具体的快照信息
 
 
AI 代码解读

image.png

 
 
查看内存各个类型占比
AI 代码解读

image.png

发现byte[]类型占比较高,char类型占比也比较高,还有int[]类型,并没有看到哪个对象占用内存很高,其实对象本身如果不是实例数太多,也就是被new了很多次,他本身占用内存其实没那么多,但是其中引用的成员变量,如果很大那么就会占用很多内存,而这部分成员变量是存储在堆区的,也就是byte[] char,String等类型。但是这部分占用比例较高的char[]是由谁来引用呢?我们看看下图

image.png

上图就是具体的实例信息,可以看到引用实例与大小,不过很遗憾,从上面并没有看到具体的内容。

## 三 结语

visualvm是很出名了分析jvm内存的工具,但是在这次排查中并没有看到具体的问题点,在问题的追踪过程中,找到了另一个工具MAT,这个工具可以更详细的对内存快照进行分析,下一篇会写MAT工具对内存快照的分析。

目录
打赏
0
0
0
0
2
分享
相关文章
【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪
【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪
502 0
追踪隐式资源,巧解内存难题!阿里云操作系统控制台上线
在云计算和容器化部署环境中,云原生容器化已成为行业标准,带来高效部署和成本控制优势的同时,也伴随新的挑战。通过操作系统内存全景功能,可一键扫描诊断,提升运维效率、降低成本,并显著提高系统稳定性。
内存泄露专题(5)动态内存追踪大杀器:bcc
内存泄露专题(5)动态内存追踪大杀器:bcc
323 0
内存泄露专题(4)mtrace内存追踪
内存泄露专题(4)mtrace内存追踪
342 0
疑案追踪:Spring Boot内存泄露排查记
疑案追踪:Spring Boot内存泄露排查记
1012 0
疑案追踪:Spring Boot内存泄露排查记
|
2月前
|
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
260 55
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
150 6
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
240 29
JVM简介—1.Java内存区域
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等