java - java中变量的内存分配

标签 java memory jvm

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

假设我有以下代码:

int notUsedVariable = aMethodThatExecutesSomethingImportantAndReturnsInt(someParameter);

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

谢谢!

最佳答案

我的观察是 javac 可能会省略未使用变量的存储操作if:

  1. 变量被标记为final 并且在声明中被初始化;
  2. 使用局部变量调试信息 (-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/

相关文章:

arrays - 使用在大多数情况下只有一个元素的向量/列表是一种浪费/糟糕的设计吗?

Ubuntu 中的 Java OutofMemory 错误,即使有足够的可用内存

java - 应用程序关闭时 JVM 垃圾收集器是否运行?

php - PHP 在 JVM 上真的更快吗?

java - 在光标更改时重新加载 ListView 动画

java - 从 JTable 的行中计算值,并在按下保存 Mysql 按钮时将其显示在另一行中

python - 压缩大型 python 对象

c - C 编程中的内存不足处理策略是什么?

java - 共享队列 VS Actor 模型

java - 我需要根据文件的 mime 类型打开文件