We should convert the following calls to store an 32-bit offset instead. That way, the CDS archive will be smaller, and it will start-up faster because fewer pointers need to be relocated with ASLR
0 ArchivePtrMarker::mark_pointer
1 ArchiveBuilder::write_pointer_in_buffer
2 ArchiveBuilder::write_pointer_in_buffer
3 RunTimeClassInfo::init
4 CopySharedClassInfoToArchive::do_entry
5 DumpTimeSharedClassTable::iterate_all_live_classes
[...]
12 SystemDictionaryShared::write_dictionary
13 SystemDictionaryShared::write_to_archive
14 VM_PopulateDumpSharedSpace::dump_read_only_tables
15 VM_PopulateDumpSharedSpace::doit
16 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer
1 ArchiveBuilder::write_pointer_in_buffer
2 ArchiveBuilder::write_pointer_in_buffer
3 LambdaProxyClassKey::init_for_archive
4 RunTimeLambdaProxyClassInfo::init
5 CopyLambdaProxyClassInfoToArchive::do_entry
[...]
9 SystemDictionaryShared::write_lambda_proxy_class_dictionary
10 SystemDictionaryShared::write_to_archive
11 VM_PopulateDumpSharedSpace::dump_read_only_tables
12 VM_PopulateDumpSharedSpace::doit
13 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer*>
1 LambdaFormInvokers::dump_static_archive_invokers
2 VM_PopulateDumpSharedSpace::dump_read_only_tables
3 VM_PopulateDumpSharedSpace::doit
4 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer
1 Modules::dump_main_module_name
2 VM_PopulateDumpSharedSpace::dump_read_only_tables
3 VM_PopulateDumpSharedSpace::doit
4 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer
1 AdjustLambdaProxyClassInfo::do_entry
[...]
5 SystemDictionaryShared::adjust_lambda_proxy_class_dictionary
6 VM_PopulateDumpSharedSpace::doit
7 VM_Operation::evaluate
===========================================================================
For example, in RunTimeClassInfo, we have
class RunTimeClassInfo {
...
InstanceKlass* _klass;
}
void RunTimeClassInfo::init(DumpTimeClassInfo& info) {
ArchiveBuilder* builder = ArchiveBuilder::current();
builder->write_pointer_in_buffer(&_klass, info._klass);
The above should be changed to:
class RunTimeClassInfo {
...
u4 * _klass_offset;
InstanceKlass* klass() { return (InstanceKlass*)(SharedBaseAddress + _klass_offset;}
}
void RunTimeClassInfo::init(DumpTimeClassInfo& info) {
ArchiveBuilder* builder = ArchiveBuilder::curent();
_klass_offset = builder->any_to_offset_u4(info._klass);
(Note: we already have similar logic in runTimeClassInfo.cpp:
vf_constraints[i]._name = builder->any_to_offset_u4(info._verifier_constraints->at(i).name());
vf_constraints[i]._from_name = builder->any_to_offset_u4(info._verifier_constraints->at(i).from_name());
0 ArchivePtrMarker::mark_pointer
1 ArchiveBuilder::write_pointer_in_buffer
2 ArchiveBuilder::write_pointer_in_buffer
3 RunTimeClassInfo::init
4 CopySharedClassInfoToArchive::do_entry
5 DumpTimeSharedClassTable::iterate_all_live_classes
[...]
12 SystemDictionaryShared::write_dictionary
13 SystemDictionaryShared::write_to_archive
14 VM_PopulateDumpSharedSpace::dump_read_only_tables
15 VM_PopulateDumpSharedSpace::doit
16 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer
1 ArchiveBuilder::write_pointer_in_buffer
2 ArchiveBuilder::write_pointer_in_buffer
3 LambdaProxyClassKey::init_for_archive
4 RunTimeLambdaProxyClassInfo::init
5 CopyLambdaProxyClassInfoToArchive::do_entry
[...]
9 SystemDictionaryShared::write_lambda_proxy_class_dictionary
10 SystemDictionaryShared::write_to_archive
11 VM_PopulateDumpSharedSpace::dump_read_only_tables
12 VM_PopulateDumpSharedSpace::doit
13 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer*>
1 LambdaFormInvokers::dump_static_archive_invokers
2 VM_PopulateDumpSharedSpace::dump_read_only_tables
3 VM_PopulateDumpSharedSpace::doit
4 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer
1 Modules::dump_main_module_name
2 VM_PopulateDumpSharedSpace::dump_read_only_tables
3 VM_PopulateDumpSharedSpace::doit
4 VM_Operation::evaluate
0 ArchivePtrMarker::mark_pointer
1 AdjustLambdaProxyClassInfo::do_entry
[...]
5 SystemDictionaryShared::adjust_lambda_proxy_class_dictionary
6 VM_PopulateDumpSharedSpace::doit
7 VM_Operation::evaluate
===========================================================================
For example, in RunTimeClassInfo, we have
class RunTimeClassInfo {
...
InstanceKlass* _klass;
}
void RunTimeClassInfo::init(DumpTimeClassInfo& info) {
ArchiveBuilder* builder = ArchiveBuilder::current();
builder->write_pointer_in_buffer(&_klass, info._klass);
The above should be changed to:
class RunTimeClassInfo {
...
u4 * _klass_offset;
InstanceKlass* klass() { return (InstanceKlass*)(SharedBaseAddress + _klass_offset;}
}
void RunTimeClassInfo::init(DumpTimeClassInfo& info) {
ArchiveBuilder* builder = ArchiveBuilder::curent();
_klass_offset = builder->any_to_offset_u4(info._klass);
(Note: we already have similar logic in runTimeClassInfo.cpp:
vf_constraints[i]._name = builder->any_to_offset_u4(info._verifier_constraints->at(i).name());
vf_constraints[i]._from_name = builder->any_to_offset_u4(info._verifier_constraints->at(i).from_name());
- relates to
-
JDK-8344824 CDS dump crashes when member_method of a lambda proxy is null
-
- Resolved
-
- links to
-
Commit(master) openjdk/jdk/d20ccd1a
-
Review(master) openjdk/jdk/21837