浅析Java中的内存泄漏
作者:goldensun 时间:2023-12-19 02:29:02
ava最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。
本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防内存泄漏。
什么是内存泄漏?
定义:如果对象在应用中不再被使用,但由于它们在其他地方被引用,垃圾回收却不能移除它们(这样就造成了很多内存不能释放,从而导致内存溢出的现象。译注)。
要理解这一定义,我们需要理解内存中对象的状态。下图说明了那些是未使用,那些是未引用。
从图中可以看到被引用对象和未引用对象(的范围)。未引用对象可以被垃圾回收机制回收,而被引用对象不能被垃圾回收机制回收。未引用对象当然是没有使用的,因为没有其他对象引用了它。然而未使用对象并不都是未引用的。某些未使用的对象仍然被其他地方引用!这就是内存泄漏起因。
为什么会发生内存泄漏?
让我们来下面的这个例子,看看为什么会发生内存泄漏。在如下例子中,A对象引用了B对象。A的生命周期(t1-t4)比B的生命周期(t2-t3)要长的多,当B不再在应用中被使用,A仍然持有对B的引用。这样一来,垃圾回收机制不能从内存中移除B。这很有可能导致内存溢出问题,因为如果其他很多对象像A一样,那么内存中将会有很多不能被回收的对象,这将消耗大量内存空间。
也有可能的情况是B持有了大量对其他对象的引用。这些被B引用的对象同样不会被回收掉。所有这些未使用的对象将会消耗宝贵的内存空间。
如何预防内存泄漏?
如下是一些预防内存泄漏的快速技巧:
1、留意集合类,比如HashMap,ArrayList等等,因为他们是内存泄漏经常发生的地方。当它们被声明为静态对象时,他们的生命周期就和应用的生命周期一样长。
2、留意事件 * 和回调。如果一个类注册了 * ,但当该类不再被使用后没有注销 * ,可能会发生内存泄漏。
3、“如果一个类管理自己的内存,程序员应该警惕内存泄漏。”[1],很多时候对象中的指向其他对象成员变量需要设置成null(才能被回收)。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java中javamail发送带附件的邮件实现方法
java中类与对象的使用详情
C#类中static变量用法分析
解决Javaweb 提交表单到servlet时出现空白页面,但网站不报错问题
![](https://img.aspxhome.com/file/2023/9/83589_0s.png)
C#实现Word和ODT文档相互转换详解
java.lang.ExceptionInInitializerError异常的解决方法
Android中Matrix用法实例分析
![](https://img.aspxhome.com/file/2023/7/113317_0s.png)
Android程序开发之手机APP创建桌面快捷方式
![](https://img.aspxhome.com/file/2023/0/89540_0s.png)
Android 自定义密码输入框实现代码
![](https://img.aspxhome.com/file/2023/2/88712_0s.png)
散列表的原理与Java实现方法详解
详解Mybatis多参数传递入参四种处理方式
SpringBoot+EasyPoi实现excel导出功能
![](https://img.aspxhome.com/file/2023/4/99744_0s.jpg)
Java 比较接口comparable与comparator区别解析
微信公众号服务号推送模板消息设置方法(后端java)
![](https://img.aspxhome.com/file/2023/7/59487_0s.jpg)
c#使用S22.Imap收剑灵激活码邮件代码示例(imap收邮件)
java使用Hashtable过滤数组中重复值的方法
Spring Security中的Servlet过滤器体系代码分析
![](https://img.aspxhome.com/file/2023/3/92553_0s.png)
SpringCloud Eureka服务注册中心应用入门详解
![](https://img.aspxhome.com/file/2023/1/79951_0s.png)