【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文件,来分析内存泄漏的问题

⭐修复问题

相关推荐
mldong2 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123453 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃3 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
Flynt4 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet4 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持4 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin5 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI6 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
cfm_29147 小时前
单例模式详解
java
我叫张土豆7 小时前
本体论、DDD、SDD、TDD:AI 编程时代的四层认知栈
java·人工智能