Java 内存泄漏说的明明白白,清清楚楚,记得点赞关注

【摘要】
目录
目录
1、什么是内存泄漏
2、内存泄漏的原因
2、内存泄漏有哪些情况
2.1 代码中没有及时释放,导致内存无法回收。
2.2 资源未关闭造成的内存泄漏
2.3 全局缓存持有的对象不使用的时候没有及时移除,导致一直在内存中无法移除
2.4 静态集合类
2.5 堆外内存无法回收
3、内存泄漏的解决办法
4、内存问题排查
第一步 首先确认逻辑问题,…

图片

目录

目录

1、什么是内存泄漏

2、内存泄漏的原因

2、内存泄漏有哪些情况

2.1 代码中没有及时释放,导致内存无法回收。

2.2 资源未关闭造成的内存泄漏

2.3 全局缓存持有的对象不使用的时候没有及时移除,导致一直在内存中无法移除

2.4 静态集合类

2.5 堆外内存无法回收

3、内存泄漏的解决办法

4、内存问题排查

第一步 首先确认逻辑问题,

第二步:分析gc是否正常执行

第三步 确认下版本新增代码的改动,尽快从代码上找出问题。

第四步:开启各种命令行和 导出 dump 各种工具分析

总结:


1、什么是内存泄漏

内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。随着垃圾回收器活动的增加以及内存占用的不断增加,程序性能会逐渐表现出来下降,极端情况下,会引发OutOfMemoryError导致程序崩溃。

2、内存泄漏的原因

JVM 虚拟机是使用引用计数法和可达性分析来判断对象是否可回收,本质是判断一个对象是否还被引用,如果没有引用则回收。在开发的过程中,由于代码的实现不同就会出现很多种内存泄漏问题,让gc 系统误以为此对象还在引用中,无法回收,造成内存泄漏。

2、内存泄漏有哪些情况

2.1 代码中没有及时释放,导致内存无法回收

下面的代码,因为是双向链表,但是断开的不够彻底,prev节点依然引用这当前正在使用的节点,导致无法回收

public class ListNode { int val; ListNode next; ListNode prev; ListNode() { } ListNode(int val) { this.val = val; } public ListNode(int val, ListNode next, ListNode prev) { this.val = val; this.next = next; this.prev = prev; }

public static void main(String[] args) { ListNode curr = new ListNode(1); ListNode prev = new ListNode(2); ListNode next = new ListNode(3); curr.prev = prev; curr.next = next; curr.prev = null; }}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享