【JVM篇】怎么解决内存泄漏问题

文章目录

🔎什么是内存泄漏

在Java中如果不再使用一个对象,但是这个对象仍然在GC Root的引用链上,这个对象就不会被垃圾回收器回收,这种情况就是内存泄漏

少量的内存泄漏可以容忍,但是如果发生了持续的内存泄漏,不管有多大的内存迟早都会被消耗完,最终导致内存溢出

🛸解决内存泄漏

⭐发现问题

这里我们需要使用VisualVM Laucher这个工具,大家可以自行科普一下使用方法

设置好参数后,然后运行下面的代码

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class OOMDemo {
    private static int _1MB=1024*1024;
    public static void main(String[] args) throws InterruptedException{
        List<Object> objects=new ArrayList<>();
        while (true){
            byte[] bytes=new byte[_1MB];
            //强引用
            objects.add(bytes);
            Thread.sleep(50);
        }
    }
}

然后我们打开工具进行分析

发现我们的堆内存是不断上涨的,这样子就造成了内存泄漏问题

如果我们把强引用这段代码(objects.add(bytes);)注释掉,再次运行看看效果

此时就没有发生内存泄漏问题,堆内存就处在一个相对比较正常的情况

⭐诊断原因

我们可以通过下面的方法生成内存快照文件

然后我们可以使用MAT工具打开hprof文件,来分析内存泄漏的问题

⭐修复问题

相关推荐
毕设源码-朱学姐7 分钟前
【开题答辩全过程】以 公务员考试在线测试系统为例,包含答辩的问题和答案
java
serendipity_hky12 分钟前
【SpringCloud | 第2篇】OpenFeign远程调用
java·后端·spring·spring cloud·openfeign
RwTo15 分钟前
【源码】-Java线程池ThreadPool
java·开发语言
SadSunset16 分钟前
(15)抽象工厂模式(了解)
java·笔记·后端·spring·抽象工厂模式
兮动人20 分钟前
EMT4J定制规则版:Java 8→17迁移兼容性检测与规则优化实战
java·开发语言·emt4j
一点★21 分钟前
Java中的常量池和字符串常量池
java·开发语言
问君能有几多愁~41 分钟前
C++ 日志实现
java·前端·c++
菜鸟plus+1 小时前
Java 接口的演变
java·开发语言
李慕婉学姐1 小时前
【开题答辩过程】以《基于springboot的地铁综合服务管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
IT空门:门主1 小时前
Spring AI的教程,持续更新......
java·人工智能·spring·spring ai