8273508: Support archived heap objects in SerialGC

Reviewed-by: tschatzl, ccheung
This commit is contained in:
Ioi Lam 2021-09-28 06:23:47 +00:00
parent 3eca9c36a6
commit 6a573b888d
13 changed files with 211 additions and 33 deletions

View file

@ -1586,7 +1586,7 @@ class PatchLoadedRegionPointers: public BitMapClosure {
};
int HeapShared::init_loaded_regions(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_regions,
uintptr_t* buffer_ret) {
MemRegion& archive_space) {
size_t total_bytes = 0;
int num_loaded_regions = 0;
for (int i = MetaspaceShared::first_archive_heap_region;
@ -1604,12 +1604,16 @@ int HeapShared::init_loaded_regions(FileMapInfo* mapinfo, LoadedArchiveHeapRegio
}
assert(is_aligned(total_bytes, HeapWordSize), "must be");
uintptr_t buffer = (uintptr_t)
Universe::heap()->allocate_loaded_archive_space(total_bytes / HeapWordSize);
_loaded_heap_bottom = buffer;
_loaded_heap_top = buffer + total_bytes;
size_t word_size = total_bytes / HeapWordSize;
HeapWord* buffer = Universe::heap()->allocate_loaded_archive_space(word_size);
if (buffer == nullptr) {
return 0;
}
archive_space = MemRegion(buffer, word_size);
_loaded_heap_bottom = (uintptr_t)archive_space.start();
_loaded_heap_top = _loaded_heap_bottom + total_bytes;
*buffer_ret = buffer;
return num_loaded_regions;
}
@ -1638,15 +1642,17 @@ bool HeapShared::load_regions(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loa
LoadedArchiveHeapRegion* ri = &loaded_regions[i];
FileMapRegion* r = mapinfo->space_at(ri->_region_index);
if (!mapinfo->read_region(ri->_region_index, (char*)load_address, r->used())) {
if (!mapinfo->read_region(ri->_region_index, (char*)load_address, r->used(), /* do_commit = */ false)) {
// There's no easy way to free the buffer, so we will fill it with zero later
// in fill_failed_loaded_region(), and it will eventually be GC'ed.
log_warning(cds)("Loading of heap region %d has failed. Archived objects are disabled", i);
_loading_failed = true;
return false;
}
log_info(cds)("Loaded heap region #%d at base " INTPTR_FORMAT " size = " SIZE_FORMAT_W(8) " bytes, delta = " INTX_FORMAT,
ri->_region_index, load_address, ri->_region_size, ri->_runtime_offset);
log_info(cds)("Loaded heap region #%d at base " INTPTR_FORMAT " top " INTPTR_FORMAT
" size " SIZE_FORMAT_W(6) " delta " INTX_FORMAT,
ri->_region_index, load_address, load_address + ri->_region_size,
ri->_region_size, ri->_runtime_offset);
uintptr_t oopmap = bitmap_base + r->oopmap_offset();
BitMapView bm((BitMap::bm_word_t*)oopmap, r->oopmap_size_in_bits());
@ -1675,10 +1681,14 @@ bool HeapShared::load_heap_regions(FileMapInfo* mapinfo) {
LoadedArchiveHeapRegion loaded_regions[MetaspaceShared::max_num_heap_regions];
memset(loaded_regions, 0, sizeof(loaded_regions));
uintptr_t buffer;
int num_loaded_regions = init_loaded_regions(mapinfo, loaded_regions, &buffer);
sort_loaded_regions(loaded_regions, num_loaded_regions, buffer);
if (!load_regions(mapinfo, loaded_regions, num_loaded_regions, buffer)) {
MemRegion archive_space;
int num_loaded_regions = init_loaded_regions(mapinfo, loaded_regions, archive_space);
if (num_loaded_regions <= 0) {
return false;
}
sort_loaded_regions(loaded_regions, num_loaded_regions, (uintptr_t)archive_space.start());
if (!load_regions(mapinfo, loaded_regions, num_loaded_regions, (uintptr_t)archive_space.start())) {
assert(_loading_failed, "must be");
return false;
}
@ -1711,7 +1721,15 @@ class VerifyLoadedHeapEmbeddedPointers: public BasicOopIterateClosure {
}
};
void HeapShared::verify_loaded_heap() {
void HeapShared::finish_initialization() {
if (is_loaded()) {
HeapWord* bottom = (HeapWord*)_loaded_heap_bottom;
HeapWord* top = (HeapWord*)_loaded_heap_top;
MemRegion archive_space = MemRegion(bottom, top);
Universe::heap()->complete_loaded_archive_space(archive_space);
}
if (VerifyArchivedFields <= 0 || !is_loaded()) {
return;
}
@ -1739,9 +1757,12 @@ void HeapShared::verify_loaded_heap() {
void HeapShared::fill_failed_loaded_region() {
assert(_loading_failed, "must be");
HeapWord* bottom = (HeapWord*)_loaded_heap_bottom;
HeapWord* top = (HeapWord*)_loaded_heap_top;
Universe::heap()->fill_with_objects(bottom, top - bottom);
if (_loaded_heap_bottom != 0) {
assert(_loaded_heap_top != 0, "must be");
HeapWord* bottom = (HeapWord*)_loaded_heap_bottom;
HeapWord* top = (HeapWord*)_loaded_heap_top;
Universe::heap()->fill_with_objects(bottom, top - bottom);
}
}
#endif // INCLUDE_CDS_JAVA_HEAP