【问题标题】:Memory leak in Java (Wikipedia)Java 中的内存泄漏(维基百科)
【发布时间】:2016-06-23 12:47:28
【问题描述】:

我试图了解在什么情况下我会在我的程序中产生内存泄漏,因此我开始阅读以德语编写的This Wikipedia page 开头的内容。

页面底部有一个用Java编写的示例:

 private static List<Integer> nummern = new ArrayList<>();
 public void erzeugeSpeicherleck() {
     for (int i=1; i<10000; i++)
     nummern.add(i);
 }
 // kein weiterer lesender Zugriff auf die List nummern (German)
 // no further read access to list 'nummern' (English)

我用 JavaScript 写了这个,一切正常。

var array = [];
for(var i=1; i<10000;i++){
    array.push(i);
    console.log(array);
}

有人能解释一下为什么 Java 中的那段代码会产生 内存泄漏 吗?

【问题讨论】:

  • 你知道 JavaScript 和 Java 的区别,不是吗?它们是根本不同的语言,仅共享名称的一部分。除此之外,注释行转换为“无法进一步读取列表'nummern'”-仍然可以访问列表:)

标签: java memory-leaks


【解决方案1】:

Java 会在需要时加载类,但从不卸载类。

因此,如果您在示例中将数据保存在像 nummern 这样的静态字段中,只要加载了类,该字段就存在。 垃圾收集器也不能收集存储在该字段中的 ArrayList,因为它仍然被该字段引用。

由于永远不会卸载类,因此永远不会释放字段使用的内存(或者具体而言,在这种情况下,字段引用的 ArrayList 实例)永远不会释放。

【讨论】:

  • 谢谢。总之,我还必须了解 Java 的工作原理
【解决方案2】:

nummern 是静态的,因此不会被垃圾收集器清理。

javascript 中没有垃圾收集器。而且你的js函数中的array不是静态的。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2013-10-21
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2016-07-21
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多