【JVM】如何解决内存泄漏问题

什么是内存泄漏,如何解决内存泄漏问题?

⚫ 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这 个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。

⚫ 少量的内存泄漏可以容忍,但是如果发生持续的内存泄漏,就像滚雪球雪球越滚越大,不管有多大的内存迟 早会被消耗完,最终导致的结果就是内存溢出。

解决内存泄漏问题的思路

发现问题-- 堆内存状况的对比

生产环境通过运维提供的Prometheus + Grafana等监控平台查看

开发、测试环境通过visualvm查看

诊断--生成内存快照

⚫ 当堆内存溢出时,需要在堆内存溢出时将整个堆内存保存下来,生成内存快照(Heap Profile)文件。 生成方式有两种

1、内存溢出时自动生成,添加生成内存快照的Java虚拟机参数:

-XX:+HeapDumpOnOutOfMemoryError:发生OutOfMemoryError错误时,自动生成hprof内存快照文件。

-XX:HeapDumpPath=:指定hprof文件的输出路径。

2、导出运行中系统的内存快照,比较简单的方式有两种,注意只需要导出标记为存活的对象: 通过JDK自带的jmap命令导出,格式为:

jmap-dump:live,format=b,file=文件路径和文件名 进程ID 通过arthas的heapdump命令导出,格式为:

heapdump--live 文件路径和文件名

诊断--MAT定位问题

⚫ 使用MAT打开hprof文件,并选择内存泄漏检测功能,MAT会自行根据内存快照中保存的数据分析内存泄漏 的根源。

修复问题

常用的JVM工具

JDK自带的命令行工具:

◆ jps 查看java进程,打印main方法所在类名和进程id

◆ jmap 1、生成堆内存快照 2、打印类的直方图

第三方工具:

VisualVM 监控 Arthas 综合性工具 MAT 堆内存分析工具

监控工具: Prometheus + grafana

相关推荐
今天的砖头有点烫手啊19 分钟前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm
凯凯姜1 小时前
JVM 内存持续增长与 Full GC 频繁
jvm
驭渊的小故事2 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
香蕉大香蕉(06敬畏市场)1 天前
高频八股 · Java 并发编程(10):异步、ThreadLocal 与虚拟线程(收官)
java·开发语言·网络·jvm·python·ai·实习
wuminyu1 天前
JVM规范学习总结-Class文件结构
java·linux·c语言·jvm·c++
酌沧2 天前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
wuminyu2 天前
JVM规范学习总结-Java源码经过javac编译后产物
java·linux·c语言·jvm·c++
学到老活到老3 天前
类已经加载了,为什么静态代码还没执行?
java·jvm
学到老活到老3 天前
写了 new,就一定会在堆上分配对象吗?
java·jvm
笨笨饿3 天前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机