8351087: Combine scratch object tables in heapShared.cpp

Reviewed-by: ccheung
This commit is contained in:
Ioi Lam 2025-03-04 05:23:16 +00:00
parent d9b98f72c2
commit b6e2d66cc4
3 changed files with 13 additions and 16 deletions

View File

@ -141,8 +141,7 @@ GrowableArrayCHeap<oop, mtClassShared>* HeapShared::_pending_roots = nullptr;
GrowableArrayCHeap<OopHandle, mtClassShared>* HeapShared::_root_segments;
int HeapShared::_root_segment_max_size_elems;
OopHandle HeapShared::_scratch_basic_type_mirrors[T_VOID+1];
MetaspaceObjToOopHandleTable* HeapShared::_scratch_java_mirror_table = nullptr;
MetaspaceObjToOopHandleTable* HeapShared::_scratch_references_table = nullptr;
MetaspaceObjToOopHandleTable* HeapShared::_scratch_objects_table = nullptr;
static bool is_subgraph_root_class_of(ArchivableStaticFieldInfo fields[], InstanceKlass* ik) {
for (int i = 0; fields[i].valid(); i++) {
@ -393,20 +392,19 @@ public:
void HeapShared::add_scratch_resolved_references(ConstantPool* src, objArrayOop dest) {
if (SystemDictionaryShared::is_builtin_loader(src->pool_holder()->class_loader_data())) {
_scratch_references_table->set_oop(src, dest);
_scratch_objects_table->set_oop(src, dest);
}
}
objArrayOop HeapShared::scratch_resolved_references(ConstantPool* src) {
return (objArrayOop)_scratch_references_table->get_oop(src);
return (objArrayOop)_scratch_objects_table->get_oop(src);
}
void HeapShared::init_dumping() {
_scratch_java_mirror_table = new (mtClass)MetaspaceObjToOopHandleTable();
_scratch_references_table = new (mtClass)MetaspaceObjToOopHandleTable();
_scratch_objects_table = new (mtClass)MetaspaceObjToOopHandleTable();
}
void HeapShared::init_scratch_objects(TRAPS) {
void HeapShared::init_scratch_objects_for_basic_type_mirrors(TRAPS) {
for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
BasicType bt = (BasicType)i;
if (!is_reference_type(bt)) {
@ -448,24 +446,24 @@ oop HeapShared::scratch_java_mirror(BasicType t) {
}
oop HeapShared::scratch_java_mirror(Klass* k) {
return _scratch_java_mirror_table->get_oop(k);
return _scratch_objects_table->get_oop(k);
}
void HeapShared::set_scratch_java_mirror(Klass* k, oop mirror) {
_scratch_java_mirror_table->set_oop(k, mirror);
_scratch_objects_table->set_oop(k, mirror);
}
void HeapShared::remove_scratch_objects(Klass* k) {
// Klass is being deallocated. Java mirror can still be alive, and it should not
// point to dead klass. We need to break the link from mirror to the Klass.
// See how InstanceKlass::deallocate_contents does it for normal mirrors.
oop mirror = _scratch_java_mirror_table->get_oop(k);
oop mirror = _scratch_objects_table->get_oop(k);
if (mirror != nullptr) {
java_lang_Class::set_klass(mirror, nullptr);
}
_scratch_java_mirror_table->remove_oop(k);
_scratch_objects_table->remove_oop(k);
if (k->is_instance_klass()) {
_scratch_references_table->remove(InstanceKlass::cast(k)->constants());
_scratch_objects_table->remove(InstanceKlass::cast(k)->constants());
}
}

View File

@ -284,8 +284,7 @@ private:
static GrowableArrayCHeap<OopHandle, mtClassShared>* _root_segments;
static int _root_segment_max_size_elems;
static OopHandle _scratch_basic_type_mirrors[T_VOID+1];
static MetaspaceObjToOopHandleTable* _scratch_java_mirror_table;
static MetaspaceObjToOopHandleTable* _scratch_references_table;
static MetaspaceObjToOopHandleTable* _scratch_objects_table;
static void init_seen_objects_table() {
assert(_seen_objects_table == nullptr, "must be");
@ -406,7 +405,7 @@ private:
static objArrayOop scratch_resolved_references(ConstantPool* src);
static void add_scratch_resolved_references(ConstantPool* src, objArrayOop dest) NOT_CDS_JAVA_HEAP_RETURN;
static void init_dumping() NOT_CDS_JAVA_HEAP_RETURN;
static void init_scratch_objects(TRAPS) NOT_CDS_JAVA_HEAP_RETURN;
static void init_scratch_objects_for_basic_type_mirrors(TRAPS) NOT_CDS_JAVA_HEAP_RETURN;
static void init_box_classes(TRAPS) NOT_CDS_JAVA_HEAP_RETURN;
static bool is_heap_region(int idx) {
CDS_JAVA_HEAP_ONLY(return (idx == MetaspaceShared::hp);)

View File

@ -572,7 +572,7 @@ void Universe::initialize_basic_type_mirrors(TRAPS) {
}
}
if (CDSConfig::is_dumping_heap()) {
HeapShared::init_scratch_objects(CHECK);
HeapShared::init_scratch_objects_for_basic_type_mirrors(CHECK);
}
}