这是关于 Java 中的内存泄漏。 我想知道, java中的内存泄漏究竟是什么? 发生内存泄漏的不同因素或代码错误是什么? 如何识别给定代码中的内存泄漏?
这些大多是面试中习惯问的问题,我想详细了解这些。有人可以解释一下并帮助我。
答案 0 :(得分:2)
Java 中的内存泄漏通常不会发生。
不是经典意义上的:在其他编程语言中,您经常需要手动释放内存。 这在 Java 中不会发生,因为通常垃圾收集器会为您删除未使用的数据。
但是,在 Java 中,您仍然可能会耗尽内存。 Java 中最接近“内存泄漏”的是你保留对不再需要的对象的引用,并且对象越来越多。
所以也许你有一个包含很多对象的列表,即使你不再需要它们,也忘记将它们从列表中删除。这样垃圾收集器就无法移除不需要的对象,因为它们仍然是需要的。
还要检查谷歌 WeakReference
答案 1 :(得分:2)
然而,这个问题太粗糙了,无法在这里得到一个完全正确的答案。我只向您展示了常见的行为模式。
什么是内存泄漏?
内存泄漏是指堆中存在不再使用的对象,但垃圾收集器无法将它们从内存中删除的情况,因此它们被不必要地维护。内存泄漏很糟糕,因为它会阻塞内存资源并随着时间的推移降低系统性能。
Java 内存泄漏的原因是什么?
第一种可能导致 Java 内存泄漏的情况是引用具有静态字段的重对象。我们将 ArrayList 创建为静态字段 - 在 JVM 进程的生命周期内,JVM 垃圾收集器永远不会收集它,即使在使用它的计算完成之后也是如此。
内存泄漏的症状:
一开始工作很快,但随着时间的推移会变慢。
常见内存泄漏:
文件/文本缓冲区未关闭。
如果未实现 equals() 和 hashcode(),则哈希映射使引用保持活动状态,例如
import java.util.Map;
public class MemLeak {
public final String key;
public MemLeak(String key) {
this.key = key;
}
public static void main(String args[]) {
try {
Map map = System.getProperties();
for(;;) { map.put(new MemLeak("key"), "value"); }
}
catch(Exception e) { e.printStackTrace(); }
}
}
如何修复它们?
有两种方法。第一个是“快速修复”尝试。如果那失败了,那么你将不得不走很长的路。