RFR: 8297914: Remove java_lang_Class::process_archived_mirror() [v2]

Calvin Cheung ccheung at openjdk.org
Fri Jan 13 18:42:16 UTC 2023


On Thu, 12 Jan 2023 19:14:44 GMT, Ioi Lam <iklam at openjdk.org> wrote:

>> This is another prerequisite for [JDK-8296344](https://bugs.openjdk.org/browse/JDK-8296344).
>> 
>> Before this PR, when archiving mirror objects (i.e., instances of `java.lang.Class`):
>> - We first allocate a copy of the mirror inside a safepoint. 
>> - We then reinitialize the contents of the copy to the desired state (so that it can be used by `Klass::restore_unshareable_info()`
>> 
>> This copy-and-modify operation inside the safepoint makes it difficult to implement [JDK-8296344](https://bugs.openjdk.org/browse/JDK-8296344). It violates the requirements [1] and [2] as stated in [JDK-8298600](https://bugs.openjdk.org/browse/JDK-8298600). Also, the reinitialization code is complicated.
>> 
>> After this PR:
>> - During the creation of each regular mirror object, we allocate a "scratch mirror" object, which has the states as expected by `Klass::restore_unshareable_info()`. See `java_lang_Class::create_scratch_mirror()`.
>> - When the archive heap is dumped inside a safepoint, we use the scratch mirror, so we can avoid the copy-and-modify operation. See `HeapShared::archive_java_mirrors()`.
>> 
>> Testing: tiers 1-4
>
> Ioi Lam has updated the pull request incrementally with three additional commits since the last revision:
> 
>  - review comments from @ashu-mehra and @dholmes-ora
>  - fixed repo
>  - tmp

I have one question.

src/hotspot/share/oops/objArrayKlass.cpp line 442:

> 440:   }
> 441: }
> 442: #endif

When will the above function be called?

>From `ClassLoaderData::free_deallocate_list()`


      // Cast them so they can be used by the template function.
      if (m->is_method()) {
        MetadataFactory::free_metadata(this, (Method*)m);
      } else if (m->is_constantPool()) {
        MetadataFactory::free_metadata(this, (ConstantPool*)m);
      } else if (m->is_klass()) {
        MetadataFactory::free_metadata(this, (InstanceKlass*)m);
      } else {
        ShouldNotReachHere();
      }

`free_metadata` will call `deallocate_contents` but I don't see how it will call the` ObjectArrayKlass` version.

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

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


More information about the hotspot-dev mailing list