我有一个关于 java 如何处理未使用变量的问题。
假设我有以下代码:
int notUsedVariable = aMethodThatExecutesSomethingImportantAndReturnsInt(someParameter);
然后我从不在代码中使用 notUsedVariable。 该变量是否会实际存储,或者 java 足够聪明以在编译时忽略该变量?
谢谢!
最佳答案
我的观察是 javac 可能会省略未使用变量的存储操作if:
- 变量被标记为
final
并且在声明中被初始化; - 您不使用局部变量调试信息 (
-g:vars
) 进行编译
如果您使用 -g:vars
进行编译,javac 将保持变量的加载和存储以用于调试目的。它似乎不认为非最终变量符合删除条件。
自己测试。我使用 JDK 7 的结果如下。结果与 JDK 8 EAP 相同。
输入:
class MyTest {
public static void main(String... args) {
int a = 1;
}
}
输出:
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
输入:
class MyTest {
public static void main(String... args) {
final int a = 1;
}
}
输出:
public static void main(java.lang.String... p0);
Flags: PUBLIC, STATIC, VARARGS
Code:
stack=1, locals=2, arguments=1
0: return
正如其他人所说,无论哪种情况,我都希望 JIT 优化器忽略任何不必要的存储操作。
关于java - java中变量的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198782/