从一个幼稚的角度来看,它看起来像是声明一个局部变量(即方法中的变量)为" 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
。
方法返回后是否保留对象? ÿ
谢谢,
答案 0 :(得分:4)
您要返回的对象存储它必须返回的值。我不会将此称为内存泄漏,因为这是您希望代码执行的操作。内存泄漏是不希望的内存浪费。
如果您将方法设置为非静态,则更大的内存泄漏可能性。在这种情况下,即使您显然不需要,也会保留对外部类别的引用及其所有数据。
方法返回后是否保留了对象?
将对象传递给println()后可以清理它。何时/如果它被清除取决于GC,但这不被视为内存泄漏。
答案 1 :(得分:1)
在你的情况下,有一个由编译器创建的匿名类,这个类引用有一个Field隐式引用Long对象实例(由' time'变量引用)。
由' time'引用的长对象的记忆。变量是ON Java堆内存。此Long对象内存将与创建的Anonymous实例具有相同的生命周期。 SO - 此处没有内存泄漏。
对于Case2 :即使是'创建'长对象内存也会存在一段时间方法已完成,因为此内存在堆上。在下一个垃圾收集器运行之前,这个内存不会被破坏-------这里没有内存泄漏。
注意:强>
我在回答一般情况。在现实世界。如果长对象的值在-127到128之间,则它可以是POOLED。在这种情况下,由变量&time;时间'引用的长对象可能与整个应用程序(JVM实例)具有相同的生命周期