java - Java中潜在的内存泄漏,这段代码是否会导致内存泄漏?

标签 java memory-leaks garbage-collection

假设我有一个 Java 代码,它不断运行并且每分钟都应该获取一组非常重的对象并处理它们。以下代码完成这项工作:

while (true) {

    ArrayList<HeavyObject> objArr = this.getHeavyObject();
    drv.processObject(objArr);

    try {
        Thread.sleep(60000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

执行ArrayList<HeavyObject> objArr = this.getHeavyObject();时这段代码可能会导致内存泄漏吗?不分配 objArr = null在获得新一批重物之前?

根据 « Memory leaks in Java » 文章使用分配给 null 很重要如果我不离开变量的范围(此代码是 main() 的一部分,并且在我退出程序之前一直有效)。

您能否阐明这方面应用于上面列出的代码?

最佳答案

只要 drv 对象不维护对 objArr 的引用,您的代码就不会出现泄漏。对“重对象”的引用 objArr 仅限于 while 循环的范围,因此一旦您离开迭代,它就有资格进行垃圾回收。 但是,如果 drv 维护对对象的永久引用,那么只要引用持续存在,就不会收集它。

您提到的链接中的示例是当对数据的引用超出范围时(在他们的示例中, Stack 类的 E[] 数组字段) 且无法收集。

关于java - Java中潜在的内存泄漏,这段代码是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223924/

相关文章:

java - 如何在 Apache Spark 中重置 MapReduce 函数上的迭代器

java - 如何将字符串短语中每个单词的首字母转换为大写?

java - Android Service 实例在 onDestroy() 和 GC 之后继续存在

java - Go 是否会受到与 Java 相同的微妙内存泄漏的影响?

C# 垃圾回收

java - 从 spring 加载多个外部属性文件

java - 为什么将此 ArrayList 视为对象列表?

android - 如何防止静态字段中上下文类导致的内存泄漏

Javascript 构造函数模式和垃圾收集器

Java程序运行一段时间后变慢