8268139: CDS ArchiveBuilder may reference unloaded classes

Reviewed-by: coleenp, ccheung
This commit is contained in:
Ioi Lam 2021-06-05 15:22:38 +00:00
parent 36bff6f945
commit 91f9adc5f5
4 changed files with 23 additions and 8 deletions

View file

@ -109,6 +109,7 @@ public:
DEBUG_ONLY(SystemDictionaryShared::NoClassLoadingMark nclm); DEBUG_ONLY(SystemDictionaryShared::NoClassLoadingMark nclm);
SystemDictionaryShared::check_excluded_classes(); SystemDictionaryShared::check_excluded_classes();
MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
init_header(); init_header();
gather_source_objs(); gather_source_objs();
reserve_buffer(); reserve_buffer();

View file

@ -489,6 +489,7 @@ void VM_PopulateDumpSharedSpace::doit() {
// that so we don't have to walk the SystemDictionary again. // that so we don't have to walk the SystemDictionary again.
SystemDictionaryShared::check_excluded_classes(); SystemDictionaryShared::check_excluded_classes();
MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
StaticArchiveBuilder builder; StaticArchiveBuilder builder;
builder.gather_source_objs(); builder.gather_source_objs();
builder.reserve_buffer(); builder.reserve_buffer();

View file

@ -352,6 +352,8 @@ public:
LambdaProxyClassKey const& k1, LambdaProxyClassKey const& k2) { LambdaProxyClassKey const& k1, LambdaProxyClassKey const& k2) {
return (k1.equals(k2)); return (k1.equals(k2));
} }
InstanceKlass* caller_ik() const { return _caller_ik; }
}; };
@ -427,7 +429,7 @@ DumpTimeLambdaProxyClassDictionary* _dumptime_lambda_proxy_class_dictionary = NU
static void add_to_dump_time_lambda_proxy_class_dictionary(LambdaProxyClassKey key, static void add_to_dump_time_lambda_proxy_class_dictionary(LambdaProxyClassKey key,
InstanceKlass* proxy_klass) { InstanceKlass* proxy_klass) {
assert(DumpTimeTable_lock->owned_by_self(), "sanity"); assert_lock_strong(DumpTimeTable_lock);
if (_dumptime_lambda_proxy_class_dictionary == NULL) { if (_dumptime_lambda_proxy_class_dictionary == NULL) {
_dumptime_lambda_proxy_class_dictionary = _dumptime_lambda_proxy_class_dictionary =
new (ResourceObj::C_HEAP, mtClass)DumpTimeLambdaProxyClassDictionary(); new (ResourceObj::C_HEAP, mtClass)DumpTimeLambdaProxyClassDictionary();
@ -1234,6 +1236,11 @@ void SystemDictionaryShared::start_dumping() {
DumpTimeSharedClassInfo* SystemDictionaryShared::find_or_allocate_info_for(InstanceKlass* k) { DumpTimeSharedClassInfo* SystemDictionaryShared::find_or_allocate_info_for(InstanceKlass* k) {
MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag); MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
return find_or_allocate_info_for_locked(k);
}
DumpTimeSharedClassInfo* SystemDictionaryShared::find_or_allocate_info_for_locked(InstanceKlass* k) {
assert_lock_strong(DumpTimeTable_lock);
if (_dumptime_table == NULL) { if (_dumptime_table == NULL) {
_dumptime_table = new (ResourceObj::C_HEAP, mtClass)DumpTimeSharedClassTable(); _dumptime_table = new (ResourceObj::C_HEAP, mtClass)DumpTimeSharedClassTable();
} }
@ -1467,8 +1474,9 @@ void SystemDictionaryShared::check_excluded_classes() {
bool SystemDictionaryShared::is_excluded_class(InstanceKlass* k) { bool SystemDictionaryShared::is_excluded_class(InstanceKlass* k) {
assert(_no_class_loading_should_happen, "sanity"); assert(_no_class_loading_should_happen, "sanity");
assert_lock_strong(DumpTimeTable_lock);
Arguments::assert_is_dumping_archive(); Arguments::assert_is_dumping_archive();
DumpTimeSharedClassInfo* p = find_or_allocate_info_for(k); DumpTimeSharedClassInfo* p = find_or_allocate_info_for_locked(k);
return (p == NULL) ? true : p->is_excluded(); return (p == NULL) ? true : p->is_excluded();
} }
@ -1505,7 +1513,8 @@ public:
IterateDumpTimeSharedClassTable(MetaspaceClosure* it) : _it(it) {} IterateDumpTimeSharedClassTable(MetaspaceClosure* it) : _it(it) {}
bool do_entry(InstanceKlass* k, DumpTimeSharedClassInfo& info) { bool do_entry(InstanceKlass* k, DumpTimeSharedClassInfo& info) {
if (!info.is_excluded()) { assert_lock_strong(DumpTimeTable_lock);
if (k->is_loader_alive() && !info.is_excluded()) {
info.metaspace_pointers_do(_it); info.metaspace_pointers_do(_it);
} }
return true; // keep on iterating return true; // keep on iterating
@ -1518,14 +1527,17 @@ public:
IterateDumpTimeLambdaProxyClassDictionary(MetaspaceClosure* it) : _it(it) {} IterateDumpTimeLambdaProxyClassDictionary(MetaspaceClosure* it) : _it(it) {}
bool do_entry(LambdaProxyClassKey& key, DumpTimeLambdaProxyClassInfo& info) { bool do_entry(LambdaProxyClassKey& key, DumpTimeLambdaProxyClassInfo& info) {
assert_lock_strong(DumpTimeTable_lock);
if (key.caller_ik()->is_loader_alive()) {
info.metaspace_pointers_do(_it); info.metaspace_pointers_do(_it);
key.metaspace_pointers_do(_it); key.metaspace_pointers_do(_it);
return true; }
return true; // keep on iterating
} }
}; };
void SystemDictionaryShared::dumptime_classes_do(class MetaspaceClosure* it) { void SystemDictionaryShared::dumptime_classes_do(class MetaspaceClosure* it) {
assert_locked_or_safepoint(DumpTimeTable_lock); assert_lock_strong(DumpTimeTable_lock);
IterateDumpTimeSharedClassTable iter(it); IterateDumpTimeSharedClassTable iter(it);
_dumptime_table->iterate(&iter); _dumptime_table->iterate(&iter);
if (_dumptime_lambda_proxy_class_dictionary != NULL) { if (_dumptime_lambda_proxy_class_dictionary != NULL) {
@ -2154,7 +2166,7 @@ void SystemDictionaryShared::write_dictionary(RunTimeSharedDictionary* dictionar
dictionary->reset(); dictionary->reset();
CompactHashtableWriter writer(_dumptime_table->count_of(is_builtin), &stats); CompactHashtableWriter writer(_dumptime_table->count_of(is_builtin), &stats);
CopySharedClassInfoToArchive copy(&writer, is_builtin); CopySharedClassInfoToArchive copy(&writer, is_builtin);
MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag); assert_lock_strong(DumpTimeTable_lock);
_dumptime_table->iterate(&copy); _dumptime_table->iterate(&copy);
writer.dump(dictionary, is_builtin ? "builtin dictionary" : "unregistered dictionary"); writer.dump(dictionary, is_builtin ? "builtin dictionary" : "unregistered dictionary");
} }

View file

@ -207,6 +207,7 @@ private:
const ClassFileStream* cfs, const ClassFileStream* cfs,
TRAPS); TRAPS);
static DumpTimeSharedClassInfo* find_or_allocate_info_for(InstanceKlass* k); static DumpTimeSharedClassInfo* find_or_allocate_info_for(InstanceKlass* k);
static DumpTimeSharedClassInfo* find_or_allocate_info_for_locked(InstanceKlass* k);
static void write_dictionary(RunTimeSharedDictionary* dictionary, static void write_dictionary(RunTimeSharedDictionary* dictionary,
bool is_builtin); bool is_builtin);
static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary); static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary);