Java 未使用的返回值会发生什么变化?
首先我确实调查过这件事。我在这里发现了同样的问题,但是关于C++: 我的兴趣是Java(尽管线程确实很有趣) 普遍的共识是,什么都不会发生,如果以后有什么事情被推翻的话。与java的线程有什么不同吗Java 未使用的返回值会发生什么变化?,java,garbage-collection,return-value,Java,Garbage Collection,Return Value,首先我确实调查过这件事。我在这里发现了同样的问题,但是关于C++: 我的兴趣是Java(尽管线程确实很有趣) 普遍的共识是,什么都不会发生,如果以后有什么事情被推翻的话。与java的线程有什么不同吗 (链接会很感激,因为我可以想象可能会发生什么,但希望得到一些证明和详细信息。此外,我正在寻找比“它没有设置为变量”更深入的内容。)编译器看到它没有被使用,只是将(返回)堆栈上的值保留为未指定值。如果指定但不使用它,它将一直存在,直到不再使用此引用为止 请参阅附带的屏幕截图。Eclipse和字节码插件
(链接会很感激,因为我可以想象可能会发生什么,但希望得到一些证明和详细信息。此外,我正在寻找比“它没有设置为变量”更深入的内容。)编译器看到它没有被使用,只是将(返回)堆栈上的值保留为未指定值。如果指定但不使用它,它将一直存在,直到不再使用此引用为止 请参阅附带的屏幕截图。Eclipse和字节码插件 在L0下,您可以看到concat调用的返回被存储(astore1)。L1下的相同调用,在Java中没有使用或分配,只是用一个POP来处理,即从堆栈中删除并消失
希望这会有帮助。如果我们编译这个程序
public class Test {
static int m() {
return 42;
}
public static void main(String[] args) {
m();
}
}
然后使用
“C:\Program Files\Java\jdk1.8.0\U 05\bin\javap.exe”-详细测试.class
对于main(),我们可以看到以下内容:
如我们所见,编译器发出一条pop
指令,指示JVM丢弃该值
在机器代码中,这意味着JVM可以自由地重用内存位置(或cpu寄存器)来保存其他变量。您想要什么样的答案?从编译器的角度来看?因为从程序员的角度来看,“它不被设置为变量”似乎是最好的答案。你能问一个比“发生了什么”更具体的问题吗?这是关于Java、Java字节码还是实时编译器编译到的实际机器代码的问题?编译器/JVM在这种情况下实际做了什么。哦,好的,非常感谢。如果你不介意我问的话,这个插件的名字是什么?我用字符串“字节码”搜索了Eclipse Marketplace,但没有返回任何结果:(
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: invokestatic #18 // Method m:()I
3: pop
4: return
LineNumberTable:
line 10: 0
line 11: 4
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 args [Ljava/lang/String;