在某些极端情况下,将局部变量归零确实可以提供帮助。这不适用于原始问题中的情况,但无论如何都是有教育意义的......让我们考虑这个程序:
public class Main {
public static void main(String[] args) {
{
Main local = new Main();
// inner = null;
}
while (true) {
// long running method
}
}
}
如果inner = null;
被注释掉,则local
变量中的对象在 while 循环期间不能被垃圾收集。原因是 Java 虚拟机不知道这样的范围。它只有:
D:\workspaces\workspace-3.4\test\src>javap -verbose -c Main
public class Main extends java.lang.Object
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#11; // java/lang/Object."<init>":()V
const #2 = class #12; // Main
const #3 = Method #2.#11; // Main."<init>":()V
const #4 = class #13; // java/lang/Object
const #5 = Asciz <init>;
const #6 = Asciz ()V;
const #7 = Asciz Code;
const #8 = Asciz main;
const #9 = Asciz ([Ljava/lang/String;)V;
const #10 = Asciz StackMapTable;
const #11 = NameAndType #5:#6;// "<init>":()V
const #12 = Asciz Main;
const #13 = Asciz java/lang/Object;
{
public Main();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: new #2; //class Main
3: dup
4: invokespecial #3; //Method "<init>":()V
7: astore_1
8: goto 8
StackMapTable: number_of_entries = 1
frame_type = 8 /* same */
}
没有关于局部变量范围的信息。所以从JVM的角度来看,上面的程序相当于:
public class Main
{
public Main() { }
public static void main(String args[])
{
Main main1 = new Main();
do
;
while(true);
}
}
(由 JAD 反编译器生成)
结论:在像这样的非常特殊的情况下,将局部变量归零是有道理的。但是,如果方法很快就会完成(就像我原来的问题一样),那也无济于事。
这受到Zdenek Tronicek 对 java-cz 邮件列表的评论的启发(用捷克语,抱歉)