java中变量的内存分配

BMF*_*BMF 2 java memory jvm

我有一个关于java如何处理未使用的变量的问题.

假设我有以下代码:

int notUsedVariable = aMethodThatExecutesSomethingImportantAndReturnsInt(someParameter);
Run Code Online (Sandbox Code Playgroud)

然后我从不在代码中使用notUsedVariable.实际上是否会存储该变量,或者java是否足够智能以在编译时忽略该变量?

谢谢!

Mik*_*bel 5

我的观察是,如果出现以下情况,javac可能会省略未使用变量的存储操作:

  1. 变量标记为final 并在声明中初始化;
  2. 你不与局部变量调试信息编译(-g:vars)

如果你编译-g:vars,javac会保持变量加载和存储以便进行调试.它似乎不认为非最终变量有资格被删除.

为自己测试.我在JDK 7的结果如下.结果与JDK 8 EAP相同.

输入:

class MyTest {
    public static void main(String... args) {
        int a = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

public static void main(java.lang.String... p0);
  Flags: PUBLIC, STATIC, VARARGS
  Code:
    stack=1, locals=2, arguments=1
         0: iconst_1
         1: istore_1
         2: return
Run Code Online (Sandbox Code Playgroud)

输入:

class MyTest {
    public static void main(String... args) {
        final int a = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

public static void main(java.lang.String... p0);
  Flags: PUBLIC, STATIC, VARARGS
  Code:
    stack=1, locals=2, arguments=1
         0: return
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,在任何一种情况下,我都希望JIT优化器省略任何不必要的存储操作.