可以在局部变量上使用final(NOT类声明或类成员)会导致内存泄漏吗?

时间:2014-10-31 14:21:47

标签: java memory-leaks garbage-collection final

从一个幼稚的角度来看,它看起来像是声明一个局部变量(即方法中的变量)为" final"可能会导致内存泄漏。

例如,

public static MyObject create()
{

     final Long time = System.millis();
     return new MyObject()
     {
           @Override public Long getTime() {return "Time is: " + time ; }
     }
}

显然,time字段必须保留,即使create()已经返回,getTime()才能正常工作。

好的,现在说我有这个方法

public static int create()
{

    final Long time = System.millis();
    System.out.println(time);
    return 2;     
}
任何内部类都没有引用

time。 方法返回后是否保留对象? ÿ

谢谢,

2 个答案:

答案 0 :(得分:4)

您要返回的对象存储它必须返回的值。我不会将此称为内存泄漏,因为这是您希望代码执行的操作。内存泄漏是不希望的内存浪费。

如果您将方法设置为非静态,则更大的内存泄漏可能性。在这种情况下,即使您显然不需要,也会保留对外部类别的引用及其所有数据。

  

方法返回后是否保留了对象?

将对象传递给println()后可以清理它。何时/如果它被清除取决于GC,但这不被视为内存泄漏。

答案 1 :(得分:1)

在你的情况下,有一个由编译器创建的匿名类,这个类引用有一个Field隐式引用Long对象实例(由' time'变量引用)。

由' time'引用的长对象的记忆。变量是ON Java堆内存。此Long对象内存将与创建的Anonymous实例具有相同的生命周期。 SO - 此处没有内存泄漏

对于Case2 :即使是'创建'长对象内存也会存在一段时间方法已完成,因为此内存在堆上。在下一个垃圾收集器运行之前,这个内存不会被破坏-------这里没有内存泄漏。

注意:

我在回答一般情况。在现实世界。如果长对象的值在-127到128之间,则它可以是POOLED。在这种情况下,由变量&time;时间'引用的长对象可能与整个应用程序(JVM实例)具有相同的生命周期