RFR: 8293980: Resolve CONSTANT_FieldRef at CDS dump time
Ioi Lam
iklam at openjdk.org
Thu May 23 03:35:19 UTC 2024
On Wed, 22 May 2024 21:48:44 GMT, Ioi Lam <iklam at openjdk.org> wrote:
> ### Overview
>
> This PR archives `CONSTANT_FieldRef` entries in the _resolved_ state when it's safe to do so.
>
> I.e., when a `CONSTANT_FieldRef` constant pool entry in class `A` refers to a *non-static* field `B.F`,
> - `B` is the same class as `A`; or
> - `B` is a supertype of `A`; or
> - `B` is one of the [vmClasses](https://github.com/openjdk/jdk/blob/3d4185a9ce482cc655a4c67f39cb2682b02ae4fe/src/hotspot/share/classfile/vmClasses.hpp), and `A` is loaded by the boot class loader.
>
> Under these conditions, it's guaranteed that whenever `A` tries to use this entry at runtime, `B` is guaranteed to have already been resolved in A's system dictionary, to the same value as resolved during dump time.
>
> Therefore, we can safely archive the `ResolvedFieldEntry` in class `A` that refers to `B.F`.
>
> (Note that we do not archive the `CONSTANT_FieldRef` entries for static fields, as the resolution of such entries can lead to class initialization at runtime. We plan to handle them in a future RFE.)
>
> ### Static CDS Archive
>
> This feature is implemented in three steps for static CDS archive dump:
>
> 1. At the end of the training run, `ClassListWriter` iterates over all loaded classes and writes the indices of their resolved `Class` and `FieldRef` constant pool entries into the classlist file, with the `@cp` prefix. E.g., the following means that the constant pool entries at indices 2, 19 and 106 were resolved during the training run:
>
> @cp java/util/Objects 2 19 106
>
> 2. When creating the static CDS archive from the classlist file, `ClassListParser` processes the `@cp` entries and resolves all the indicated entries.
>
> 3. Inside the `ArchiveBuilder::make_klasses_shareable()` function, we iterate over all entries in all archived `ConstantPools`. When we see a _resolved_ entry that does not satisfy the safety requirements as stated in _Overview_, we revert it back to the unresolved state.
>
> ### Dynamic CDS Archive
>
> When dumping the dynamic CDS archive, `ClassListWriter` and `ClassListParser` are not used, so steps 1 and 2 are skipped. We only perform step 3 when the archive is being written.
>
> ### Limitations
>
> - For safety, we limit this optimization to only classes loaded by the boot, platform, and app class loaders. This may be relaxed in the future.
> - We archive only the constant pool entries that are actually resolved during the training run. We don't speculatively resolve other entries, as doing so may cause C2 to unnecessarily generate code for paths that are never taken by the app...
I pressed the wrong button and sent out the RFR mail too soon ....
I have finished updating the PR description text. It's ready for review now.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/19355#issuecomment-2126167774
More information about the build-dev
mailing list