gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:26 24 4
gpt4 key购买 nike

我很好奇 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com