【问题标题】:Performance differences between static and non-static final primitive fields in JavaJava中静态和非静态最终原始字段之间的性能差异
【发布时间】:2011-04-19 14:45:51
【问题描述】:

我最近遇到了一个声明了以下字段的类:

private final int period = 1000;

在这个特殊的例子中,作者打算让它也是静态的,因为值不能在任何时候改变,没有真正的函数理由不将它声明为静态,但这让我想知道 Java 是如何处理最终与最终静态原语。

特别是:

1) 最终的静态原语如何存储?它们是否只是直接编译成使用它们的表达式?

2) 如果它们实际上被分配了存储,那么包含类的每个实例是否都必须维护对该位置的引用? (在这种情况下,对于小于 4 字节的原语,类的每个实例实际上都会比直接包含原语时更大,就像在非静态情况下一样)

3) 编译器现在是否足够聪明,可以确定在上述情况下,变量是“有效静态的”,因为不可能让不同的实例包含不同的值,因此与最终的静态变量类似地对其进行优化?

【问题讨论】:

    标签: java static private final


    【解决方案1】:

    1) 最终的静态原语如何存储?它们是否只是直接编译成使用它们的表达式?

    不直接编译到表达式中。它们被编译成 .class 文件并由操作码 ldc 引用。

    2) 如果它们实际上被分配了存储,那么包含类的每个实例是否都必须维护对该位置的引用? (在这种情况下,对于小于 4 字节的原语,类的每个实例实际上都会比直接包含原语时更大,就像在非静态情况下一样)

    不,“引用”被嵌入到字节码中,因此不需要在每个实例的基础上存储任何内容。

    3) 编译器现在是否足够聪明,可以确定在上述情况下,变量是“有效静态的”,因为不可能让不同的实例包含不同的值,因此与最终的静态变量类似地对其进行优化?

    不确定,但我怀疑它是否在编译器级别进行了优化。 JIT 可能会发挥作用。但是,我完全不确定您期望什么样的“性能差异”。无论如何,性能影响都可以忽略不计。 (静态/非静态/最终/非最终)

    【讨论】:

    • 回复:#3,我实际上并没有真正期望性能差异速度明智,但不知道它是否通过不按实例存储它来优化它,例如实际的静态最终字段。事后看来,性能差异可能是用词不当。感谢您的澄清
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多