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

⭐修复问题

相关推荐
budingxiaomoli43 分钟前
Spring IoC &DI
java·spring·ioc·di
Spider Cat 蜘蛛猫1 小时前
Springboot SSO系统设计文档
java·spring boot·后端
未若君雅裁1 小时前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
2401_867623981 小时前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python
学习中.........1 小时前
从扰动函数的变化,感受红黑树带来的性能提升
java
计算机安禾2 小时前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
weixin199701080162 小时前
【保姆级教程】淘宝/天猫商品详情 API(item_get)接入指南:Python/Java/PHP 调用示例与 JSON 返回值解析
java·python·php
环流_2 小时前
redis核心数据类型在java中的操作
java·数据库·redis
雨辰AI2 小时前
SpringBoot3 项目国产化改造完整流程|从 MySQL 到人大金仓落地
java·数据库·后端·mysql·政务
带刺的坐椅2 小时前
Java 流程编排新范式 Solon Flow:一个引擎,七种节点,覆盖规则/任务/工作流/AI 编排全场景
java·spring·ai·solon·flow