mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 01:54:47 +02:00
8273508: Support archived heap objects in SerialGC
Reviewed-by: tschatzl, ccheung
This commit is contained in:
parent
3eca9c36a6
commit
6a573b888d
13 changed files with 211 additions and 33 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue