Skip to content

Commit ad89146

Browse files
committed
8288601: Consolidate static/dynamic archive tables
Reviewed-by: ccheung
1 parent 7e211d7 commit ad89146

File tree

4 files changed

+72
-80
lines changed

4 files changed

+72
-80
lines changed

src/hotspot/share/cds/runTimeClassInfo.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424

2525
#include "precompiled.hpp"
2626
#include "cds/archiveBuilder.hpp"
27+
#include "cds/dumpTimeClassInfo.hpp"
2728
#include "cds/runTimeClassInfo.hpp"
29+
#include "classfile/systemDictionaryShared.hpp"
2830

2931
void RunTimeClassInfo::init(DumpTimeClassInfo& info) {
3032
ArchiveBuilder* builder = ArchiveBuilder::current();

src/hotspot/share/cds/runTimeClassInfo.hpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424

2525
#ifndef SHARED_CDS_SHAREDCLASSINFO_HPP
2626
#define SHARED_CDS_SHAREDCLASSINFO_HPP
27+
2728
#include "classfile/compactHashtable.hpp"
2829
#include "classfile/javaClasses.hpp"
29-
#include "classfile/systemDictionaryShared.hpp"
3030
#include "cds/archiveBuilder.hpp"
3131
#include "cds/archiveUtils.hpp"
3232
#include "cds/metaspaceShared.hpp"
@@ -36,6 +36,7 @@
3636
#include "utilities/growableArray.hpp"
3737
#include "utilities/resourceHash.hpp"
3838

39+
class DumpTimeClassInfo;
3940
class Method;
4041
class Symbol;
4142

@@ -46,7 +47,7 @@ class RunTimeClassInfo {
4647
int _clsfile_crc32;
4748
};
4849

49-
// This is different than DumpTimeClassInfo::DTVerifierConstraint. We use
50+
// This is different than DumpTimeClassInfo::DTVerifierConstraint. We use
5051
// u4 instead of Symbol* to save space on 64-bit CPU.
5152
struct RTVerifierConstraint {
5253
u4 _name;

src/hotspot/share/classfile/systemDictionaryShared.cpp

+46-65
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,13 @@
7373
#include "utilities/resourceHash.hpp"
7474
#include "utilities/stringUtils.hpp"
7575

76+
SystemDictionaryShared::ArchiveInfo SystemDictionaryShared::_static_archive;
77+
SystemDictionaryShared::ArchiveInfo SystemDictionaryShared::_dynamic_archive;
78+
7679
DumpTimeSharedClassTable* SystemDictionaryShared::_dumptime_table = NULL;
7780
DumpTimeSharedClassTable* SystemDictionaryShared::_cloned_dumptime_table = NULL;
7881
DumpTimeLambdaProxyClassDictionary* SystemDictionaryShared::_dumptime_lambda_proxy_class_dictionary = NULL;
7982
DumpTimeLambdaProxyClassDictionary* SystemDictionaryShared::_cloned_dumptime_lambda_proxy_class_dictionary = NULL;
80-
// SystemDictionaries in the base layer static archive
81-
RunTimeSharedDictionary SystemDictionaryShared::_builtin_dictionary;
82-
RunTimeSharedDictionary SystemDictionaryShared::_unregistered_dictionary;
83-
// SystemDictionaries in the top layer dynamic archive
84-
RunTimeSharedDictionary SystemDictionaryShared::_dynamic_builtin_dictionary;
85-
RunTimeSharedDictionary SystemDictionaryShared::_dynamic_unregistered_dictionary;
86-
87-
LambdaProxyClassDictionary SystemDictionaryShared::_lambda_proxy_class_dictionary;
88-
LambdaProxyClassDictionary SystemDictionaryShared::_dynamic_lambda_proxy_class_dictionary;
8983

9084
DEBUG_ONLY(bool SystemDictionaryShared::_no_class_loading_should_happen = false;)
9185
bool SystemDictionaryShared::_dump_in_progress = false;
@@ -127,7 +121,9 @@ InstanceKlass* SystemDictionaryShared::lookup_from_stream(Symbol* class_name,
127121
return NULL;
128122
}
129123

130-
const RunTimeClassInfo* record = find_record(&_unregistered_dictionary, &_dynamic_unregistered_dictionary, class_name);
124+
const RunTimeClassInfo* record = find_record(&_static_archive._unregistered_dictionary,
125+
&_dynamic_archive._unregistered_dictionary,
126+
class_name);
131127
if (record == NULL) {
132128
return NULL;
133129
}
@@ -843,10 +839,9 @@ InstanceKlass* SystemDictionaryShared::get_shared_lambda_proxy_class(InstanceKla
843839
MutexLocker ml(CDSLambda_lock, Mutex::_no_safepoint_check_flag);
844840
LambdaProxyClassKey key(caller_ik, invoked_name, invoked_type,
845841
method_type, member_method, instantiated_method_type);
846-
const RunTimeLambdaProxyClassInfo* info = _lambda_proxy_class_dictionary.lookup(&key, key.hash(), 0);
842+
const RunTimeLambdaProxyClassInfo* info = _static_archive.lookup_lambda_proxy_class(&key);
847843
if (info == NULL) {
848-
// Try lookup from the dynamic lambda proxy class dictionary.
849-
info = _dynamic_lambda_proxy_class_dictionary.lookup(&key, key.hash(), 0);
844+
info = _dynamic_archive.lookup_lambda_proxy_class(&key);
850845
}
851846
InstanceKlass* proxy_klass = NULL;
852847
if (info != NULL) {
@@ -1303,15 +1298,14 @@ void SystemDictionaryShared::write_dictionary(RunTimeSharedDictionary* dictionar
13031298
}
13041299

13051300
void SystemDictionaryShared::write_to_archive(bool is_static_archive) {
1306-
if (is_static_archive) {
1307-
write_dictionary(&_builtin_dictionary, true);
1308-
write_dictionary(&_unregistered_dictionary, false);
1309-
} else {
1310-
write_dictionary(&_dynamic_builtin_dictionary, true);
1311-
write_dictionary(&_dynamic_unregistered_dictionary, false);
1301+
ArchiveInfo* archive = get_archive(is_static_archive);
1302+
1303+
if (_dumptime_table != NULL) {
1304+
write_dictionary(&archive->_builtin_dictionary, true);
1305+
write_dictionary(&archive->_unregistered_dictionary, false);
13121306
}
13131307
if (_dumptime_lambda_proxy_class_dictionary != NULL) {
1314-
write_lambda_proxy_class_dictionary(&_lambda_proxy_class_dictionary);
1308+
write_lambda_proxy_class_dictionary(&archive->_lambda_proxy_class_dictionary);
13151309
}
13161310
}
13171311

@@ -1324,22 +1318,11 @@ void SystemDictionaryShared::adjust_lambda_proxy_class_dictionary() {
13241318

13251319
void SystemDictionaryShared::serialize_dictionary_headers(SerializeClosure* soc,
13261320
bool is_static_archive) {
1327-
FileMapInfo *dynamic_mapinfo = FileMapInfo::dynamic_info();
1328-
if (is_static_archive) {
1329-
_builtin_dictionary.serialize_header(soc);
1330-
_unregistered_dictionary.serialize_header(soc);
1331-
if (dynamic_mapinfo == NULL || DynamicDumpSharedSpaces || (dynamic_mapinfo != NULL && UseSharedSpaces)) {
1332-
_lambda_proxy_class_dictionary.serialize_header(soc);
1333-
}
1334-
} else {
1335-
_dynamic_builtin_dictionary.serialize_header(soc);
1336-
_dynamic_unregistered_dictionary.serialize_header(soc);
1337-
if (DynamicDumpSharedSpaces) {
1338-
_lambda_proxy_class_dictionary.serialize_header(soc);
1339-
} else {
1340-
_dynamic_lambda_proxy_class_dictionary.serialize_header(soc);
1341-
}
1342-
}
1321+
ArchiveInfo* archive = get_archive(is_static_archive);
1322+
1323+
archive->_builtin_dictionary.serialize_header(soc);
1324+
archive->_unregistered_dictionary.serialize_header(soc);
1325+
archive->_lambda_proxy_class_dictionary.serialize_header(soc);
13431326
}
13441327

13451328
void SystemDictionaryShared::serialize_vm_classes(SerializeClosure* soc) {
@@ -1384,7 +1367,9 @@ SystemDictionaryShared::find_record(RunTimeSharedDictionary* static_dict, RunTim
13841367
}
13851368

13861369
InstanceKlass* SystemDictionaryShared::find_builtin_class(Symbol* name) {
1387-
const RunTimeClassInfo* record = find_record(&_builtin_dictionary, &_dynamic_builtin_dictionary, name);
1370+
const RunTimeClassInfo* record = find_record(&_static_archive._builtin_dictionary,
1371+
&_dynamic_archive._builtin_dictionary,
1372+
name);
13881373
if (record != NULL) {
13891374
assert(!record->_klass->is_hidden(), "hidden class cannot be looked up by name");
13901375
assert(check_alignment(record->_klass), "Address not aligned");
@@ -1456,56 +1441,51 @@ class SharedLambdaDictionaryPrinter : StackObj {
14561441
}
14571442
};
14581443

1459-
void SystemDictionaryShared::print_on(const char* prefix,
1460-
RunTimeSharedDictionary* builtin_dictionary,
1461-
RunTimeSharedDictionary* unregistered_dictionary,
1462-
LambdaProxyClassDictionary* lambda_dictionary,
1463-
outputStream* st) {
1444+
void SystemDictionaryShared::ArchiveInfo::print_on(const char* prefix,
1445+
outputStream* st) {
14641446
st->print_cr("%sShared Dictionary", prefix);
14651447
SharedDictionaryPrinter p(st);
14661448
st->print_cr("%sShared Builtin Dictionary", prefix);
1467-
builtin_dictionary->iterate(&p);
1449+
_builtin_dictionary.iterate(&p);
14681450
st->print_cr("%sShared Unregistered Dictionary", prefix);
1469-
unregistered_dictionary->iterate(&p);
1470-
if (!lambda_dictionary->empty()) {
1451+
_unregistered_dictionary.iterate(&p);
1452+
if (!_lambda_proxy_class_dictionary.empty()) {
14711453
st->print_cr("%sShared Lambda Dictionary", prefix);
14721454
SharedLambdaDictionaryPrinter ldp(st, p.index());
1473-
lambda_dictionary->iterate(&ldp);
1455+
_lambda_proxy_class_dictionary.iterate(&ldp);
14741456
}
14751457
}
14761458

1459+
void SystemDictionaryShared::ArchiveInfo::print_table_statistics(const char* prefix,
1460+
outputStream* st) {
1461+
st->print_cr("%sArchve Statistics", prefix);
1462+
_builtin_dictionary.print_table_statistics(st, "Builtin Shared Dictionary");
1463+
_unregistered_dictionary.print_table_statistics(st, "Unregistered Shared Dictionary");
1464+
_lambda_proxy_class_dictionary.print_table_statistics(st, "Lambda Shared Dictionary");
1465+
}
1466+
14771467
void SystemDictionaryShared::print_shared_archive(outputStream* st, bool is_static) {
14781468
if (UseSharedSpaces) {
14791469
if (is_static) {
1480-
print_on("", &_builtin_dictionary, &_unregistered_dictionary, &_lambda_proxy_class_dictionary, st);
1470+
_static_archive.print_on("", st);
14811471
} else {
14821472
if (DynamicArchive::is_mapped()) {
1483-
print_on("", &_dynamic_builtin_dictionary, &_dynamic_unregistered_dictionary,
1484-
&_dynamic_lambda_proxy_class_dictionary, st);
1473+
_dynamic_archive.print_on("Dynamic ", st);
14851474
}
14861475
}
14871476
}
14881477
}
14891478

14901479
void SystemDictionaryShared::print_on(outputStream* st) {
1491-
if (UseSharedSpaces) {
1492-
print_on("", &_builtin_dictionary, &_unregistered_dictionary, &_lambda_proxy_class_dictionary, st);
1493-
if (DynamicArchive::is_mapped()) {
1494-
print_on("", &_dynamic_builtin_dictionary, &_dynamic_unregistered_dictionary,
1495-
&_dynamic_lambda_proxy_class_dictionary, st);
1496-
}
1497-
}
1480+
print_shared_archive(st, true);
1481+
print_shared_archive(st, false);
14981482
}
14991483

15001484
void SystemDictionaryShared::print_table_statistics(outputStream* st) {
15011485
if (UseSharedSpaces) {
1502-
_builtin_dictionary.print_table_statistics(st, "Builtin Shared Dictionary");
1503-
_unregistered_dictionary.print_table_statistics(st, "Unregistered Shared Dictionary");
1504-
_lambda_proxy_class_dictionary.print_table_statistics(st, "Lambda Shared Dictionary");
1486+
_static_archive.print_table_statistics("Static ", st);
15051487
if (DynamicArchive::is_mapped()) {
1506-
_dynamic_builtin_dictionary.print_table_statistics(st, "Dynamic Builtin Shared Dictionary");
1507-
_dynamic_unregistered_dictionary.print_table_statistics(st, "Unregistered Shared Dictionary");
1508-
_dynamic_lambda_proxy_class_dictionary.print_table_statistics(st, "Dynamic Lambda Shared Dictionary");
1488+
_dynamic_archive.print_table_statistics("Dynamic ", st);
15091489
}
15101490
}
15111491
}
@@ -1680,9 +1660,10 @@ void SystemDictionaryShared::update_archived_mirror_native_pointers() {
16801660
if (MetaspaceShared::relocation_delta() == 0) {
16811661
return;
16821662
}
1683-
update_archived_mirror_native_pointers_for(&_builtin_dictionary);
1684-
update_archived_mirror_native_pointers_for(&_unregistered_dictionary);
1685-
update_archived_mirror_native_pointers_for(&_lambda_proxy_class_dictionary);
1663+
// mirrors are not archived for the classes in the dynamic archive
1664+
update_archived_mirror_native_pointers_for(&_static_archive._builtin_dictionary);
1665+
update_archived_mirror_native_pointers_for(&_static_archive._unregistered_dictionary);
1666+
update_archived_mirror_native_pointers_for(&_static_archive._lambda_proxy_class_dictionary);
16861667

16871668
for (int t = T_BOOLEAN; t <= T_LONG; t++) {
16881669
Klass* k = Universe::typeArrayKlassObj((BasicType)t);

src/hotspot/share/classfile/systemDictionaryShared.hpp

+21-13
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,20 @@ class SharedClassLoadingMark {
137137
class SystemDictionaryShared: public SystemDictionary {
138138
friend class ExcludeDumpTimeSharedClasses;
139139
friend class CleanupDumpTimeLambdaProxyClassTable;
140+
141+
struct ArchiveInfo {
142+
RunTimeSharedDictionary _builtin_dictionary;
143+
RunTimeSharedDictionary _unregistered_dictionary;
144+
LambdaProxyClassDictionary _lambda_proxy_class_dictionary;
145+
146+
const RunTimeLambdaProxyClassInfo* lookup_lambda_proxy_class(LambdaProxyClassKey* key) {
147+
return _lambda_proxy_class_dictionary.lookup(key, key->hash(), 0);
148+
}
149+
150+
void print_on(const char* prefix, outputStream* st);
151+
void print_table_statistics(const char* prefix, outputStream* st);
152+
};
153+
140154
public:
141155
enum {
142156
FROM_FIELD_IS_PROTECTED = 1 << 0,
@@ -150,14 +164,13 @@ class SystemDictionaryShared: public SystemDictionary {
150164
static DumpTimeSharedClassTable* _cloned_dumptime_table;
151165
static DumpTimeLambdaProxyClassDictionary* _dumptime_lambda_proxy_class_dictionary;
152166
static DumpTimeLambdaProxyClassDictionary* _cloned_dumptime_lambda_proxy_class_dictionary;
153-
// SystemDictionaries in the base layer static archive
154-
static RunTimeSharedDictionary _builtin_dictionary;
155-
static RunTimeSharedDictionary _unregistered_dictionary;
156-
static LambdaProxyClassDictionary _lambda_proxy_class_dictionary;
157-
// SystemDictionaries in the top layer dynamic archive
158-
static RunTimeSharedDictionary _dynamic_builtin_dictionary;
159-
static RunTimeSharedDictionary _dynamic_unregistered_dictionary;
160-
static LambdaProxyClassDictionary _dynamic_lambda_proxy_class_dictionary;
167+
168+
static ArchiveInfo _static_archive;
169+
static ArchiveInfo _dynamic_archive;
170+
171+
static ArchiveInfo* get_archive(bool is_static_archive) {
172+
return is_static_archive ? &_static_archive : &_dynamic_archive;
173+
}
161174

162175
static InstanceKlass* load_shared_class_for_builtin_loader(
163176
Symbol* class_name,
@@ -184,11 +197,6 @@ class SystemDictionaryShared: public SystemDictionary {
184197

185198
static bool _dump_in_progress;
186199
DEBUG_ONLY(static bool _no_class_loading_should_happen;)
187-
static void print_on(const char* prefix,
188-
RunTimeSharedDictionary* builtin_dictionary,
189-
RunTimeSharedDictionary* unregistered_dictionary,
190-
LambdaProxyClassDictionary* lambda_dictionary,
191-
outputStream* st) NOT_CDS_RETURN;
192200

193201
public:
194202
static bool is_hidden_lambda_proxy(InstanceKlass* ik);

0 commit comments

Comments
 (0)