java内存泄漏的原因

时间:2021-07-05 08:55:06

标签: java

这是关于 Java 中的内存泄漏。 我想知道, java中的内存泄漏究竟是什么? 发生内存泄漏的不同因素或代码错误是什么? 如何识别给定代码中的内存泄漏?

这些大多是面试中习惯问的问题,我想详细了解这些。有人可以解释一下并帮助我。

2 个答案:

答案 0 :(得分:2)

Java 中的内存泄漏通常不会发生。

不是经典意义上的:在其他编程语言中,您经常需要手动释放内存。 这在 Java 中不会发生,因为通常垃圾收集器会为您删除未使用的数据。

但是,在 Java 中,您仍然可能会耗尽内存。 Java 中最接近“内存泄漏”的是你保留对不再需要的对象的引用,并且对象越来越多。

所以也许你有一个包含很多对象的列表,即使你不再需要它们,也忘记将它们从列表中删除。这样垃圾收集器就无法移除不需要的对象,因为它们仍然是需要的。

还要检查谷歌 WeakReference

答案 1 :(得分:2)

然而,这个问题太粗糙了,无法在这里得到一个完全正确的答案。我只向您展示了常见的行为模式。

什么是内存泄漏?
内存泄漏是指堆中存在不再使用的对象,但垃圾收集器无法将它们从内存中删除的情况,因此它们被不必要地维护。内存泄漏很糟糕,因为它会阻塞内存资源并随着时间的推移降低系统性能。

Java 内存泄漏的原因是什么?
第一种可能导致 Java 内存泄漏的情况是引用具有静态字段的重对象。我们将 ArrayList 创建为静态字段 - 在 JVM 进程的生命周期内,JVM 垃圾收集器永远不会收集它,即使在使用它的计算完成之后也是如此。

内存泄漏的症状:
一开始工作很快,但随着时间的推移会变慢。

  • 适用于小型数据集,适用于大型数据集会出现严重的性能问题
  • 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(); }
    }
}

如何修复它们?
有两种方法。第一个是“快速修复”尝试。如果那失败了,那么你将不得不走很长的路。

  1. 快速修复:Eclipse 内存泄漏警告(捕获一些泄漏)
  2. 使用 VisualVM(或 Jconsole 或 Thermostat)等 JVM 工具手动禁用和启用部分代码并观察 JVM 的内存使用情况。