Java: 内存泄漏

来源:互联网 发布:2012年欧洲杯决赛 知乎 编辑:程序博客网 时间:2024/06/03 21:02

内存泄露是什么呢? 内存泄漏是指,一个不再被程序使用的对象或变量还在内存中战友存储空间。

为了防止研发人员忘记释放已被分配的内存,Java语言引入了垃圾回收机制,由垃圾回收器回收不再使用的对象,既然有垃圾回收器来负责回收垃圾,那么,Java中是否还会存在内存泄漏的问题呢?答案是存在内存泄漏。

首先,在Java语言中,判断一个内存空间是否符合垃圾回收的标准有两个:

1. 给对象赋予了空值null,以后再没有被使用过。

2.给对象赋予了新值,重新分配了内存空间。


所以内存泄漏主要有两种情况:

1.在堆中申请的空间没有被释放

2.对象已经不再被使用,但仍还在内存中保留着。


垃圾回收机制可以有效的解决第一种情况,而第二种却无法保证。Java中的内存泄漏主要指的是第二种。


通常,Java语言中容易引起内存泄漏的原因有很多,主要有以下几方面:

a.静态集合类。如果容器是静态的,由于他们的生命周期与程序一致,那么容器中的对象在程序结束之前都不能被释放,从而造成内存泄漏。


b.各种连接。 比如数据库连接、网络连接、以及io连接。只有在连接被关闭后,垃圾回收器才会回收对应的对象。如果未被关闭,会造成大量的对象无法回收,从而引起内存泄漏。


c.监听器


d.变量不合理的作用域。一般而言,如果一个变量定义的作用范围大于其使用范围,很可能造成内存泄漏,另一方面,如果没有及时把对象设置为null,也很有可能导致内存泄漏。


e.单例模式。 饿汉式单例模式,比较容易引起内存泄漏。

原创粉丝点击