Java的最大优势之一是其内存管理。您只需创建对象,Java Garbage Collector便会分配和释放内存。但是,情况并非如此简单,因为Java应用程序中经常发生内存泄漏。




java 中内存屏障 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()。