文章目录
- 🔎什么是内存泄漏
- 🛸解决内存泄漏
- ⭐发现问题
- ⭐诊断原因
- ⭐修复问题
🔎什么是内存泄漏
在Java中如果不再使用一个对象,但是这个对象仍然在GC Root的引用链上,这个对象就不会被垃圾回收器回收,这种情况就是内存泄漏
少量的内存泄漏可以容忍,但是如果发生了持续的内存泄漏,不管有多大的内存迟早都会被消耗完,最终导致内存溢出
🛸解决内存泄漏
⭐发现问题
这里我们需要使用VisualVM Laucher这个工具,大家可以自行科普一下使用方法
设置好参数后,然后运行下面的代码
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文件,来分析内存泄漏的问题