首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最终静态和最终非静态字段以及JVM优化

最终静态和最终非静态字段以及JVM优化
EN

Stack Overflow用户
提问于 2015-09-11 08:18:17
回答 2查看 936关注 0票数 6

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

代码语言:javascript
复制
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,但我可以说,这些值实际上对于所有实例都是常见的--我确信,每个实例都有一个带有值132CODE_A字段。

TestClassY中,我可以使用语法TestClassY.CODE_A,但乍一看,对于看到“哦,这些值在所有实例中都很常见”的开发人员来说,这只会更容易。

我的主要问题是:--我猜,在TestClassX的情况下,每次创建新实例时,final字段都不会使用任何额外的内存。是吗?JVM在这种情况下进行优化吗?是什么样的优化?

额外的问题1)我也确信我遗漏了一些非常重要的东西,这也是我怀疑的原因。那是什么?

额外的问题2)顺便问一下。在JVM优化之后,我如何查看我的Java源代码是什么样子(这样我就可以在将来使用了;)?任何IDE支持这样的功能吗?比如IntelliJ?我只想看看JVM如何对待我的TestClassXTestClassY

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-11 12:30:27

  • 非静态字段总是存在于实例中。它们不能节省记忆。
  • 一般来说,JVM不优化非静态字段。即使它们是最终值,仍然可以使用反射或反序列化过程将它们设置为不同的值。
  • 有一个实验性的VM选项-XX:+TrustFinalNonStaticFields (默认情况下为off),它告诉JVM优化对这些字段的访问,即将它们视为常量并消除字段负载。
  • 有一个-XX:+PrintAssembly VM选项来转储JIT编译的代码。
票数 8
EN

Stack Overflow用户

发布于 2015-09-11 08:25:37

关于你问题的第一部分,也许this answer可以帮你。

对于第二部分,您可以通过在运行/编译代码时添加-XX:+PrintOptoAssembly标志来查看生成的程序集(如this answer中所述)。

我还应该补充一点,提供给您的程序集代码不是jvm生成的真正操作代码,而是需要在实际架构下运行的代码。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32518787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档