【问题标题】:Causes of memory leak in java [duplicate]java中内存泄漏的原因[重复]
【发布时间】:2021-09-16 01:36:47
【问题描述】:

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

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

【问题讨论】:

  • baeldung.com/…。可能有帮助
  • 这个问题对于stackoverflow来说太宽泛了。请阅读stackoverflow.com/help/asking
  • @KarthikeyanVaithilingam 感谢 baeldung.com/...。 ,这对我理解内存泄漏问题有很大帮助。

标签: java


【解决方案1】:

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

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

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

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

还可以在谷歌上查看WeakReference

【讨论】:

    【解决方案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 的内存使用情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2010-09-22
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多