Java内存泄漏

来源:互联网 发布:软件开发技术联盟 编辑:程序博客网 时间:2024/06/06 20:26

内存泄漏的定义:对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用。

内存泄露示意图:

从图中可以看到被引用的对象和未被引用的对象。未被引用的对象将会被垃圾回收器回收,而被引用对象则不会被回收。未被引用的对象理所当然是未被使用的,因为没有其他的对象引用它。然而,未被使用的对象并不一定是未被引用的,其中一些是被引用的,这就是内存泄漏的起因。

为什么会发生内存泄漏?

让我们来看看下面这个例子,看看为什么内存泄漏会发生。在如下例子中,对象A引用了对象B。A的生命周期(t1—t4)要比B的生命周期(t2—t3)长很多。当B不再用于应用中时,A仍然持有对它的引用。在这种方式下,垃圾回收器就不能将B从内存中移除。这将可能导致出现内存不足的问题,因为如果A对更多的对象做同样的事情,那么内存中将会有很多无法被回收的对象,这将极度耗费内存空间。

也有可能B持有大量对其他对象的引用,这些被B引用的对象也不能够被回收。所有这些未被使用的对象将会耗费宝贵的内存空间。

此外,JDK6中的substring方法也会引起内存泄露!

如何避免内存泄漏?

  1. 尽早释放无用对象(将其置为null);
  2. 在进行字符串连接操作时,避免使用String,而应该使用StringBuilder/StringBuffer;
  3. 尽量少用静态变量;
  4. 避免集中创建对象尤其是大对象;
  5. 优化JVM参数配置(设置Xms和Xmx参数值相等——JVM默认空间是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4,如果内存剩余不到40%,JVM就会增大到Xmx设置的值,内存剩余超过70%,JVM就会减小到Xms设置的值,所以Xmx和Xms一般应该设置成相同以避免每次GC都要调整堆的大小)。

 

0 0
原创粉丝点击