> ### 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...
Ioi Lam has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision: - Fixed typo in previous commit - Merge branch 'master' into 8293980-resolve-fields-at-dumptime - @matias9927 comments - moved remove_resolved_field_entries_if_non_deterministic() to cpCache - Merge branch 'master' into 8293980-resolve-fields-at-dumptime - 8293980: Resolve CONSTANT_FieldRef at CDS dump time ------------- Changes: - all: https://git.openjdk.org/jdk/pull/19355/files - new: https://git.openjdk.org/jdk/pull/19355/files/3900c568..89184c33 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=19355&range=02 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19355&range=01-02 Stats: 13691 lines in 428 files changed: 7998 ins; 3129 del; 2564 mod Patch: https://git.openjdk.org/jdk/pull/19355.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/19355/head:pull/19355 PR: https://git.openjdk.org/jdk/pull/19355