java - 最终静态与最终非静态字段和 JVM 优化

标签 java optimization static jvm final

我很好奇 JVM 如何处理 static final 字段。我看到一个类似的问题here但这不是我要找的。让我们考虑这样的例子:

public class TestClassX {
   public final int CODE_A = 132;
   public final int CODE_B = 948;
   public final int CODE_C = 288;
   // some other code
}

public class TestClassY {
   public static final int CODE_A = 132;
   public static final int CODE_B = 948;
   public static final int CODE_C = 288;
   // some other code
}

TestClassX 字段中,因为它们是 final 且无法修改,所以在 TestClassX 类的所有实例中都具有相同的值。当然我不能写 TestClassX.CODE_A 但我可以说,这些值实际上对所有实例都是通用的 - 我敢肯定,每个实例都有一个 CODE_A 字段值 132

TestClassY 中,我可以使用语法 TestClassY.CODE_A,但乍一看,对于看到“哦,这些值对于所有实例”。

我的主要问题: 我猜 JVM,在 TestClassX 的情况下,不会在每次创建新实例时为 final 字段使用任何额外的内存。可以? JVM在这种情况下有没有做优化,是什么优化?

附加问题 1) 我也确定我在这里遗漏了一些非常重要的东西,这是我怀疑的原因。那是什么?

附加问题 2) 顺便说一句。我如何查看我的 Java 源代码在 JVM 优化后的样子(以便我将来可以使用 ;))?是否有任何 IDE 支持这样的功能?例如 IntelliJ?我只想看看 JVM 如何处理我的 TestClassXTestClassY

最佳答案

  • 非静态字段总是出现在实例中。它们不节省内存。
  • 一般来说,JVM 不会优化非静态字段。即使它们是最终的,它们仍然可以使用反射或在反序列化期间设置为不同的值。
  • 有一个实验性 VM 选项 -XX:+TrustFinalNonStaticFields(默认关闭),它告诉 JVM 优化对此类字段的访问,即将它们视为常量并消除字段负载。
  • 有一个-XX:+PrintAssembly用于转储 JIT 编译代码的 VM 选项。

关于java - 最终静态与最终非静态字段和 JVM 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518787/

相关文章:

java - Jenkins 不可读的 POM

java - Apache Camel Http 和 SSL

java - AspectJ:尝试使用外部 aop.xml 文件时出现类加载问题

java - 从spring config调用静态方法

java - 如何为程序只填充一次HashMap对象?

c++ - C++中的静态 map 初始化

java - 按日期对具有 itemBean 的列表进行排序?

计算具有 sin/cos LUT 的 tan

javascript - 如何以只需要一种方法(如果可能)的方式优化我的代码?

eclipse - 有没有自动优化Eclipse.ini文件的插件?