RFR: 8293336: AOT-linking of invokedynamic for lambda expression and string concat [v12]

Ioi Lam iklam at openjdk.org
Mon Oct 21 21:58:39 UTC 2024


> This is the 7th and final PR for [JEP 483: Ahead-of-Time Class Loading & Linking](https://bugs.openjdk.org/browse/JDK-8315737).
> 
> This PR implements the AOT-linking of invokedynamic callsites:
> - We only link lambda expressions (`LambdaMetafactory::metafactory`) and string concat (`StringConcatFactory::makeConcatWithConstants()`) as the results of these bootstrap methods do not have environment dependencies and can be safely cached.
> - The resolved CallSites are represented as Java heap objects. Thus, this optimizations is supported only for the static CDS archive, which can store heap objects. The dynamic CDS archive is not supported.
> 
> **Review Notes:**
> 
> - Start with `AOTConstantPoolResolver::preresolve_indy_cp_entries()` -- it checks all indys that were linked during the training run, and aot-links only those for lambdas and string concats
> - `SystemDictionaryShared::find_all_archivable_classes()` finds all the hidden classes that are reachable from the indy CallSites
> - In `MetaspaceShared::preload_and_dump_impl()` we call `MethodType::createArchivedObjects()` to record all MethodTypes that were created in the assembly phase. This is necessary because the identity of MethodTypes is significant (they are compared with the `==` operator). Also see MethodType.java for the corresponding code that are used in the production run.
> - Afterwards, we enter the safepoint (`VM_PopulateDumpSharedSpace::doit()`). In this safepoint,  `ConstantPoolCache::remove_resolved_indy_entries_if_non_deterministic()` is called to remove any resolved indy callsites that cannot be archived. (Such CallSites may be created as a side effect of Java code execution in the assembly phase. E.g., the bootstrap of the module system).
> 
> **Rough Edges:**
> 
> - Many archived CallSites references (directly or indirectly) the static fields of the classes listed under `AOTClassInitializer::can_archive_initialized_mirror()`, where the object identity of these static fields is significant. Therefore, we must preserve the initialized states of these classes. Otherwise, we might run into problems such as [JDK-8340836](https://bugs.openjdk.org/browse/JDK-8340836). Unfortunately, the list is created by trial-and-error, and may need to be updated to match changes in the `java.lang.invoke` and `jdk.internal.constant` packages. We expect Project Leyden to come with a general solution to this problem.
> - If the identity is significant for a static field in a complex class, but not all of the static fields of this cl...

Ioi Lam has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 39 commits:

 - dholmes-ora comment - removed direct_only parameter from InstanceKlass::is_enum_subclass()
 - In respond to @ashu-mehra review: add comment about why the main module name needs to be lifted out of MetaspaceShared::serialize()
 - Merge branch 'jep-483-step-06-8311071-avoid-soft-refs-in-java-lang-invoke' into jep-483-step-07-8293336-store-lambda-forms-in-cds-archive
 - @stefank comment -- changed to assert(is_pending_aot_linked_class(k), "sanity")
 - Added ClaimMetadataVisitingOopIterateClosure::assert_is_pending_aot_linked_class()
 - @rose00 comments -- tighten up the checks for what can or cannot be aot-inited; removed is_trivial_clinit() as it is used only in logging but the meaning is unclear
 - @liach comments -- added comments; added asserts for HashMap safety in MethodType.java
 - Fixed typo in last commit; fixed header inclusion order
 - @DanHeidinga comments -- added comments and asserts related to ClassLoaderData used by archived hidden classes
 - Merge branch 'jep-483-step-06-8311071-avoid-soft-refs-in-java-lang-invoke' into jep-483-step-07-8293336-store-lambda-forms-in-cds-archive
 - ... and 29 more: https://git.openjdk.org/jdk/compare/a9ae70e2...044f28a7

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

Changes: https://git.openjdk.org/jdk/pull/21143/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21143&range=11
  Stats: 2729 lines in 73 files changed: 2387 ins; 144 del; 198 mod
  Patch: https://git.openjdk.org/jdk/pull/21143.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21143/head:pull/21143

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


More information about the core-libs-dev mailing list