JDK-8134758 : Final String field values should be trusted as stable
  • Type: Enhancement
  • Component: hotspot
  • Sub-Component: compiler
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2015-08-31
  • Updated: 2019-11-08
  • Resolved: 2015-09-02
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
9 b83Fixed
Related Reports
Relates :  
Relates :  
We have an UseImplicitStableValues option that enables treating some known VM fields as stable. However, for String.value, it does only seem to matter in GraphKit, and therefore only the targeted compiler optimizations benefit from this, not the normal Java code. This gets in the way with Compact String work, which has a new "byte coder" field, that participates in every hot method, e.g.:

    public int length() {
        return value.length >> coder;

This method is compiled normally, and so escapes the provisions of UseImplicitStableValues. When we ask for "someconstantstring".length(), the coder field would always be read. To solve this, we might want to mark all final String fields as stable. It is not sufficient, however, to put @Stable over them (even if @Stable was a public annotation), because one of the legitimate values for "coder" is zero, which is coincidentally the default value for byte field. Therefore, we might need to put final String fields to TrustFinalNonStaticFields exceptions, to fold every value of coder.
Simple benchmark: http://cr.openjdk.java.net/~shade/8134758/ConstLengthBench.java Returns the performance of String.length() back to JDK 8 levels: # JDK 8u40: ConstLengthBench.cmp1 2.830 �� 0.031 ns/op ConstLengthBench.cmp2 2.811 �� 0.002 ns/op # JDK 9, Compact Strings, before: ConstLengthBench.cmp1 3.561 �� 0.093 ns/op ConstLengthBench.cmp2 3.513 �� 0.004 ns/op # JDK 9, Compact Strings, after: ConstLengthBench.cmp1 2.819 �� 0.015 ns/op ConstLengthBench.cmp2 2.810 �� 0.001 ns/op

Webrev: http://cr.openjdk.java.net/~shade/8134758/webrev.00/