java - 方法中未使用的局部变量是否会在 JVM 中获取内存?

标签 java

我在 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/

相关文章:

java - 显示大量 JTextPanes?

java - Crypt 使用 RESTEasy 通过注释解密 java 对象 ID

java - Spring序列化时如何忽略临时对象属性

java - 每个 DAO 方法的 EntityManager

java - 使用枚举扩展类 - java

java - 为什么 YARN java 堆空间内存错误?

java - 如何检查java中的不同类中是否单击了按钮?

java - 解析 CSV 文本文件,忽略逗号及其周围的空格

java - WCF FaultException<T> 是否支持与 Java Web 服务故障的互操作

java - 在 Java 计算器中允许多个输入