加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – final static vs final非静态字段和JVM优化

发布时间:2020-12-14 05:51:22 所属栏目:Java 来源:网络整理
导读:我很好奇JVM如何处理静态最终字段.我看到了一个类似的问题 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}p
我很好奇JVM如何处理静态最终字段.我看到了一个类似的问题 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字段中,由于它们是最终的且无法修改,因此在TestClassX类的所有实例中具有相同的值.当然我不能编写TestClassX.CODE_A,但我可以说,这些值实际上对所有实例都是通用的 – 我敢肯定,每个实例都有一个值为132的CODE_A字段.

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

我的主要问题:
我想JVM,在TestClassX的情况下,每次创建新实例时都不会为最终字段使用任何额外的内存.可以? JVM是否在这种情况下进行任何优化以及它是什么样的优化?

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

额外的问题2)顺便说一句.如何在JVM优化之后查看我的Java源代码的样子(以便将来可以使用;))?有没有IDE支持这样的功能?例如IntelliJ?我想简单地看看JVM如何处理我的TestClassX和TestClassY.

解决方法

>实例中始终存在非静态字段.他们不节省记忆.
>通常,JVM不会优化非静态字段.即使它们是最终的,它们仍然可以使用反射或反序列化设置为不同的值.
>有一个实验性VM选项-XX:TrustFinalNonStaticFields(默认情况下为off),它告诉JVM优化对这些字段的访问,即将它们视为常量并消除字段加载.
>有一个 -XX:+PrintAssembly VM选项可以转储JIT编译的代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读