RFR: 8293291: Simplify relocation of native pointers in archive heap
Calvin Cheung
ccheung at openjdk.org
Fri Sep 16 22:47:06 UTC 2022
On Thu, 15 Sep 2022 20:49:24 GMT, Ioi Lam <iklam at openjdk.org> wrote:
> Some objects in the archive heap contain native pointers. E.g., archived `java.lang.Class` objects contain a pointer to its `Klass*`.
>
> At runtime, if the archived metadata are mapped at an alternative address, all of the `Klass*` pointers must be relocated. Instead of doing this in an ad-hoc way, this PR uses a bitmap, `FileMapRegion::ptrmap_view()`, to track the position of all the native pointers.
>
> This PR is done in preparation for supporting new types of archived heap objects that have native pointers. E.g., `java.lang.invoke.ResolvedMethodName` has a pointer to a `Method*`.
>
>
> Notes for reviewers:
>
> - At dump time, the native pointers are remembered in `HeapShared::mark_native_pointers()`.
> - At runtime, the native pointers are patched in `ArchiveHeapLoader::patch_native_pointers()`.
> - The ad-hoc relocation code has been removed from javaClasses.cpp and systemDictionaryShared.cpp
> - Many of the changes are for renaming from "oopmaps" to "bitmaps": the old code handled only a single type of pointers (oop references). The new code handles two types of bitmaps ("oopmap" is for oop references, "ptrmap" is for native pointers).
I've a few minor comments. Thanks.
src/hotspot/share/cds/filemap.cpp line 1693:
> 1691: int oopmap_idx = i * 2;
> 1692: int ptrmap_idx = i * 2 + 1;
> 1693: space_at(region_idx)->init_bitmaps(bitmaps->at(i*2), bitmaps->at(i*2 + 1));
Please add some comment on oopmap_idx and ptrmap_idx.
Line 1693 could be:
`space_at(region_idx)->init_bitmaps(bitmaps->at(oopmap_idx), bitmaps->at(ptrmap_idx));`
src/hotspot/share/cds/heapShared.cpp line 1848:
> 1846: }
> 1847:
> 1848: log_info(cds, heap)("calculate_ptrmap: marked %d non-null native pointers our of "
typo: our -> out
src/hotspot/share/cds/metaspaceShared.cpp line 907:
> 905: GrowableArray<ArchiveHeapOopmapInfo>* oopmaps) {
> 906: for (int i=0; i<regions->length(); i++) {
> 907: ResourceBitMap oopmap = HeapShared::calculate_oopmap(regions->at(i));
Pre-existing: line 908.
While you're touching this code, please add a space before and after the '=' and '<'.
src/hotspot/share/include/cds.h line 59:
> 57: // for alignment purposed.
> 58: size_t _oopmap_offset; // Bitmap for relocating oop fields in archived heap objects.
> 59: // (The base address is the botom of the BM region)
typo: botom -> bottom
src/hotspot/share/include/cds.h line 62:
> 60: size_t _oopmap_size_in_bits;
> 61: size_t _ptrmap_offset; // Bitmap for relocating native pointer fields in archived heap objects.
> 62: // (The base address is the botom of the BM region).
typo: botom -> bottom
-------------
PR: https://git.openjdk.org/jdk/pull/10296
More information about the hotspot-runtime-dev
mailing list