我在 SO Do uninitialized primitive instance variables use memory? 中看到了这篇文章
它指出“在 Java 中,声明一个类级别的实例变量而不初始化它是否需要内存? 例如:int i;如果我不使用 i = 5 初始化它,请使用任何内存;?”
我的问题是,如果是局部变量,比如说我有一个方法 foo()
public int foo(){
int x;
//Write code which does not use/initialize x
}
局部变量x
会不会占用内存?
编辑
乔恩的答案是
更新:对此进行更多研究,我发现这个页面向我表明,尽管编译后的字节码暗示空间是为 x 分配的,但它确实可能被 jvm 优化掉了。不幸的是,我没有找到对所执行优化的完整描述。特别是,关于编译的 JVM 文档章节没有提到从堆栈中删除未使用的变量。因此,除非有进一步的发现,否则我的回答是它依赖于实现,但这似乎是任何自尊的编译器都会执行的优化。还要注意,这是一个局部变量而不是一个字段并不重要——事实上,局部变量是最有可能被优化掉的变量,因为它们最容易分析和消除。 (正是因为它们是本地的)
让我们看看是否能找到更多支持这一点的证据。
最佳答案
类级别/实例级别变量将自动初始化为其默认值。所以,是的,当一个类被初始化/分别创建实例时,它们会占用一些空间。
就方法局部变量而言,不,如果它们只是声明但没有初始化,那么它们不会使用任何空间,它们就像被编译器忽略一样好..
如果你的代码是这样的:
public static void main(String[] args) {
int i; // ignored
int j = 5;
String s = "abc";
String sNull; // ignored
}
字节码:
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 args [Ljava/lang/String;
2 4 2 j I
5 1 3 s Ljava/lang/String;
}
关于java - 方法中未使用的局部变量是否会在 JVM 中获取内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632799/