RFR: 8288425: Footprint regression due MH creation when initializing StringConcatFactory

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Jun 16 10:35:14 UTC 2022


On Wed, 15 Jun 2022 22:43:55 GMT, Paul Sandoz <psandoz at openjdk.org> wrote:

>> src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java line 729:
>> 
>>> 727:         MethodHandle base = PREPEND_BASE;
>>> 728:         if (base == null) {
>>> 729:             base = PREPEND_BASE = MethodHandles.dropArguments(
>> 
>> I'm curious about this idiom - couldn't this result in the `PREPEND_BASE` field being assigned twice, with objects that are morally identical, but could have different identities? (thus violating `@Stable` contract)
>
> It's not a violation, it's relying on behavior not discussed by the `@Stable` doc, which refers to such behavior as "undefined".
> 
> It's a carefully correlated dance between the code, interpreter, and C2 relying on:
> 1. safe publication of equivalent immutable structures with no dependence on their identity when operating on them;
> 2. the field being set in the interpreter; and 
> 3. by the time C2 inlines `prependBase` the field is no longer be updated, thus C2 can replace the field access with its value.

Thanks, I think I was missing (2)

-------------

PR: https://git.openjdk.org/jdk/pull/9154


More information about the core-libs-dev mailing list