RFR: 8374549: Extend MetaspaceClosure to cover non-MetaspaceObj types
Ioi Lam
iklam at openjdk.org
Fri Jan 23 06:25:56 UTC 2026
On Thu, 22 Jan 2026 17:35:14 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:
>> Previously, `MetaspaceClosure` could iterate only `MetaspaceObject`, using its four member functions:
>>
>> - `is_read_only_by_default()`
>> - `metaspace_pointers_do()`
>> - `size()`
>> - `type()`
>>
>> `PackageEntry`, `ModuleEntry` and `GrowableArray` cannot be subclasses from `MetaspaceObject` due to various constraints. As a result, they were copied with ad-hoc code.
>>
>> This PR updates the templates in `MetaspaceClosure` so that it can iterate any classes that have the above four functions. This allows new types of data to be uniformly copied into the AOT cache (aka CDS archive) without ad-hoc copiers.
>>
>> This PR is necessary for future evolution of AOT as more types of data will be copied into the AOT cache. For example, in Valhalla we have a `GrowableArray` that needs to be copied along with `AdapterHandleEntry`.
>
> src/hotspot/share/cds/cppVtables.cpp line 62:
>
>> 60:
>> 61: // AOTGrowableArray has a vtable only when in non-product builds (due to
>> 62: // the virtual printing functions in AnyObj).
>
> Can we devirtualize it? You would need to reconstruct Vpointer in non-debug build otherwise.
Since `AnyObj` doesn't carry any type information, we cannot easily devirtualize this call.
In debug builds, the vtable is updated in the production run. The vtable updates are driven by the `CPP_VTABLE_TYPES_DO` macro in cppVtables.cpp. The following have been added to this macro
#ifndef PRODUCT
// AOTGrowableArray has a vtable only when in non-product builds (due to
// the virtual printing functions in AnyObj).
using GrowableArray_ModuleEntry_ptr = AOTGrowableArray<ModuleEntry*>;
#define DEBUG_CPP_VTABLE_TYPES_DO(f) \
f(GrowableArray_ModuleEntry_ptr) \
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/29049#discussion_r2719775522
More information about the hotspot-dev
mailing list