Java内存泄漏的介绍

 

Java内存泄漏的介绍

 

Java最重要的优势之一是它的内存管理。您只需创建对象,Java Garbage Collector负责分配和释放内存。但是,情况并不那么简单,因为Java应用程序中经常发生内存泄漏。

本教程说明了什么是内存泄漏,它发生的原因以及如何防止它们。

1.什么是记忆泄漏?

内存泄漏的定义:应用程序不再使用对象,但垃圾收集器无法删除它们,因为它们被引用。

要理解这个定义,我们需要了解内存中的对象状态。下图说明了未使用的内容和未引用的内容。

其中-是存储器泄漏

从图中可以看到引用的对象未引用的对象。未引用的对象将被垃圾收集,而引用的对象将不会被垃圾收集。未引用的对象肯定未使用,因为没有其他对象引用它。但是,未使用的对象并非全部未引用。其中一些被引用!这就是内存泄漏的来源。

 

2.为什么内存泄漏会发生?

让我们看一下下面的例子,看看为什么会发生内存泄漏。在下面的示例中,对象A引用对象B.A的生命周期(t1-t4)比B(t2-t3)长得多。当B不再在应用程序中使用时,A仍然保留对它的引用。这样,垃圾收集器无法从内存中删除B. 这可能会导致内存不足问题,因为如果A对更多对象执行相同的操作,那么会有很多未收集的对象并占用内存空间。

B也可能拥有一堆其他对象的引用。B引用的那些对象也不会被收集。所有这些未使用的对象将消耗宝贵的内存空间

对象寿命时

 

3.如何防止内存泄漏?

以下是一些防止内存泄漏的快速实用技巧。

  1. 请注意Collection类,例如HashMap,ArrayList等,因为它们是查找内存泄漏的常见位置。声明static它们时,它们的使用寿命与应用程序的使用寿命相同。
  2. 注意事件监听器和回调。如果监听器已注册但在不再使用该类时未注册,则可能发生内存泄漏。
  3. “如果一个类管理自己的内存,那么程序员应该警惕内存泄漏。”[1]通常,指向其他对象的对象的成员变量必须为空。

 

4.一点测验:为什么JDK 6中的substring()方法会导致内存泄漏?

要回答这个问题,您可能需要阅读JDK 6和7中的Substring()

 

参考文献:
[1]布洛赫,约书亚。有效的java。Addison-Wesley Professional,2008。
[2] IBM Developer Work。http://www.ibm.com/developerworks/library/j-leaks/

转载来源:https://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/

猜你喜欢

转载自blog.csdn.net/Aria_Miazzy/article/details/87870537