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

时间:2015-03-15 16:44:54

标签: java garbage-collection return-value

首先我确实调查了这一点。我在这里找到了同样的问题,但是关于C ++:What happens to unused function return values?

我对Java很感兴趣(虽然这个帖子确实很有趣)。

普遍的共识是,没有任何事情真的发生,如果有什么事情在以后被覆盖。这个线程与java有什么不同吗?

(链接会受到赞赏,因为我可以想象可能会发生什么,但想要一些证据和细节。而且我还要寻找更深入的东西"它没有被设置为变量")

2 个答案:

答案 0 :(得分:9)

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

请参阅随附的屏幕截图。 Eclipse和字节码插件。

在L0下,您可以看到存储了concat调用的返回值(ASTORE 1)。在L1中的相同调用(在Java中未被使用或分配)仅使用POP进行处理,它也被从堆栈中移除并消失。

bytecode of return handling

希望有所帮助。

答案 1 :(得分:3)

如果我们编译程序

public class Test {
    static int m() {
        return 42;
    }

    public static void main(String[] args) {
        m();
    }
}

然后用

检查生成的字节码
  

“C:\ Program Files \ Java \ jdk1.8.0_05 \ bin \ javap.exe”-verbose Test.class

我们在main()中看到以下内容:

  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;

正如我们所看到的,编译器发出pop指令,指示JVM丢弃该值。

在机器代码中,这意味着JVM可以自由地重用内存位置(或cpu寄存器)来保存其他变量。