Java 未使用的返回值会发生什么变化?

Java 未使用的返回值会发生什么变化?,java,garbage-collection,return-value,Java,Garbage Collection,Return Value,首先我确实调查过这件事。我在这里发现了同样的问题,但是关于C++: 我的兴趣是Java(尽管线程确实很有趣) 普遍的共识是,什么都不会发生,如果以后有什么事情被推翻的话。与java的线程有什么不同吗 (链接会很感激,因为我可以想象可能会发生什么,但希望得到一些证明和详细信息。此外,我正在寻找比“它没有设置为变量”更深入的内容。)编译器看到它没有被使用,只是将(返回)堆栈上的值保留为未指定值。如果指定但不使用它,它将一直存在,直到不再使用此引用为止 请参阅附带的屏幕截图。Eclipse和字节码插件

首先我确实调查过这件事。我在这里发现了同样的问题,但是关于C++:

我的兴趣是Java(尽管线程确实很有趣)

普遍的共识是,什么都不会发生,如果以后有什么事情被推翻的话。与java的线程有什么不同吗


(链接会很感激,因为我可以想象可能会发生什么,但希望得到一些证明和详细信息。此外,我正在寻找比“它没有设置为变量”更深入的内容。)

编译器看到它没有被使用,只是将(返回)堆栈上的值保留为未指定值。如果指定但不使用它,它将一直存在,直到不再使用此引用为止

请参阅附带的屏幕截图。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;