Skip to content

Commit c7a679f

Browse files
committed
8297290: Use int indices to reference CDS archived primitive mirrors
Reviewed-by: ccheung
1 parent 37f613b commit c7a679f

File tree

6 files changed

+75
-51
lines changed

6 files changed

+75
-51
lines changed

src/hotspot/share/cds/heapShared.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ void HeapShared::write_subgraph_info_table() {
833833
#endif
834834
}
835835

836-
void HeapShared::serialize(SerializeClosure* soc) {
836+
void HeapShared::serialize_root(SerializeClosure* soc) {
837837
oop roots_oop = NULL;
838838

839839
if (soc->reading()) {
@@ -849,6 +849,9 @@ void HeapShared::serialize(SerializeClosure* soc) {
849849
roots_oop = roots();
850850
soc->do_oop(&roots_oop); // write to archive
851851
}
852+
}
853+
854+
void HeapShared::serialize_tables(SerializeClosure* soc) {
852855

853856
#ifndef PRODUCT
854857
soc->do_ptr((void**)&_archived_ArchiveHeapTestClass);

src/hotspot/share/cds/heapShared.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,8 @@ class HeapShared: AllStatic {
410410

411411
static void init_for_dumping(TRAPS) NOT_CDS_JAVA_HEAP_RETURN;
412412
static void write_subgraph_info_table() NOT_CDS_JAVA_HEAP_RETURN;
413-
static void serialize(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
413+
static void serialize_root(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
414+
static void serialize_tables(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
414415
static bool initialize_enum_klass(InstanceKlass* k, TRAPS) NOT_CDS_JAVA_HEAP_RETURN_(false);
415416

416417
// Returns the address of a heap object when it's mapped at the

src/hotspot/share/cds/metaspaceShared.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ void MetaspaceShared::serialize(SerializeClosure* soc) {
375375

376376
// Dump/restore miscellaneous metadata.
377377
JavaClasses::serialize_offsets(soc);
378+
HeapShared::serialize_root(soc);
378379
Universe::serialize(soc);
379380
soc->do_tag(--tag);
380381

@@ -385,7 +386,7 @@ void MetaspaceShared::serialize(SerializeClosure* soc) {
385386
// Dump/restore the symbol/string/subgraph_info tables
386387
SymbolTable::serialize_shared_table_header(soc);
387388
StringTable::serialize_shared_table_header(soc);
388-
HeapShared::serialize(soc);
389+
HeapShared::serialize_tables(soc);
389390
SystemDictionaryShared::serialize_dictionary_headers(soc);
390391

391392
InstanceMirrorKlass::serialize_offsets(soc);
@@ -1499,6 +1500,8 @@ void MetaspaceShared::initialize_shared_spaces() {
14991500
static_mapinfo->patch_heap_embedded_pointers();
15001501
ArchiveHeapLoader::finish_initialization();
15011502

1503+
CDS_JAVA_HEAP_ONLY(Universe::update_archived_basic_type_mirrors());
1504+
15021505
// Close the mapinfo file
15031506
static_mapinfo->close();
15041507

src/hotspot/share/classfile/javaClasses.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -1122,8 +1122,9 @@ void java_lang_Class::archive_basic_type_mirrors() {
11221122

11231123
for (int t = T_BOOLEAN; t < T_VOID+1; t++) {
11241124
BasicType bt = (BasicType)t;
1125-
oop m = Universe::_mirrors[t].resolve();
1126-
if (m != NULL) {
1125+
if (!is_reference_type(bt)) {
1126+
oop m = Universe::java_mirror(bt);
1127+
assert(m != NULL, "sanity");
11271128
// Update the field at _array_klass_offset to point to the relocated array klass.
11281129
oop archived_m = HeapShared::archive_object(m);
11291130
assert(archived_m != NULL, "sanity");
@@ -1138,7 +1139,7 @@ void java_lang_Class::archive_basic_type_mirrors() {
11381139
"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,
11391140
type2name(bt), p2i(m), p2i(archived_m));
11401141

1141-
Universe::replace_mirror(bt, archived_m);
1142+
Universe::set_archived_basic_type_mirror_index(bt, HeapShared::append_root(archived_m));
11421143
}
11431144
}
11441145
}

src/hotspot/share/memory/universe.cpp

+46-40
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@
8888
Klass* Universe::_typeArrayKlassObjs[T_LONG+1] = { NULL /*, NULL...*/ };
8989
Klass* Universe::_objectArrayKlassObj = NULL;
9090
Klass* Universe::_fillerArrayKlassObj = NULL;
91-
OopHandle Universe::_mirrors[T_VOID+1];
91+
OopHandle Universe::_basic_type_mirrors[T_VOID+1];
92+
#if INCLUDE_CDS_JAVA_HEAP
93+
int Universe::_archived_basic_type_mirror_indices[T_VOID+1];
94+
#endif
9295

9396
OopHandle Universe::_main_thread_group;
9497
OopHandle Universe::_system_thread_group;
@@ -180,24 +183,20 @@ oop Universe::virtual_machine_error_instance() { return _virtual_machine_erro
180183

181184
oop Universe::the_null_sentinel() { return _the_null_sentinel.resolve(); }
182185

183-
oop Universe::int_mirror() { return check_mirror(_mirrors[T_INT].resolve()); }
184-
oop Universe::float_mirror() { return check_mirror(_mirrors[T_FLOAT].resolve()); }
185-
oop Universe::double_mirror() { return check_mirror(_mirrors[T_DOUBLE].resolve()); }
186-
oop Universe::byte_mirror() { return check_mirror(_mirrors[T_BYTE].resolve()); }
187-
oop Universe::bool_mirror() { return check_mirror(_mirrors[T_BOOLEAN].resolve()); }
188-
oop Universe::char_mirror() { return check_mirror(_mirrors[T_CHAR].resolve()); }
189-
oop Universe::long_mirror() { return check_mirror(_mirrors[T_LONG].resolve()); }
190-
oop Universe::short_mirror() { return check_mirror(_mirrors[T_SHORT].resolve()); }
191-
oop Universe::void_mirror() { return check_mirror(_mirrors[T_VOID].resolve()); }
186+
oop Universe::int_mirror() { return check_mirror(_basic_type_mirrors[T_INT].resolve()); }
187+
oop Universe::float_mirror() { return check_mirror(_basic_type_mirrors[T_FLOAT].resolve()); }
188+
oop Universe::double_mirror() { return check_mirror(_basic_type_mirrors[T_DOUBLE].resolve()); }
189+
oop Universe::byte_mirror() { return check_mirror(_basic_type_mirrors[T_BYTE].resolve()); }
190+
oop Universe::bool_mirror() { return check_mirror(_basic_type_mirrors[T_BOOLEAN].resolve()); }
191+
oop Universe::char_mirror() { return check_mirror(_basic_type_mirrors[T_CHAR].resolve()); }
192+
oop Universe::long_mirror() { return check_mirror(_basic_type_mirrors[T_LONG].resolve()); }
193+
oop Universe::short_mirror() { return check_mirror(_basic_type_mirrors[T_SHORT].resolve()); }
194+
oop Universe::void_mirror() { return check_mirror(_basic_type_mirrors[T_VOID].resolve()); }
192195

193196
oop Universe::java_mirror(BasicType t) {
194197
assert((uint)t < T_VOID+1, "range check");
195-
return check_mirror(_mirrors[t].resolve());
196-
}
197-
198-
// Used by CDS dumping
199-
void Universe::replace_mirror(BasicType t, oop new_mirror) {
200-
Universe::_mirrors[t].replace(new_mirror);
198+
assert(!is_reference_type(t), "sanity");
199+
return check_mirror(_basic_type_mirrors[t].resolve());
201200
}
202201

203202
void Universe::basic_type_classes_do(KlassClosure *closure) {
@@ -236,30 +235,36 @@ void Universe::metaspace_pointers_do(MetaspaceClosure* it) {
236235
_do_stack_walk_cache->metaspace_pointers_do(it);
237236
}
238237

239-
// Serialize metadata and pointers to primitive type mirrors in and out of CDS archive
240-
void Universe::serialize(SerializeClosure* f) {
241-
242238
#if INCLUDE_CDS_JAVA_HEAP
243-
{
244-
oop mirror_oop;
239+
void Universe::set_archived_basic_type_mirror_index(BasicType t, int index) {
240+
assert(DumpSharedSpaces, "dump-time only");
241+
assert(!is_reference_type(t), "sanity");
242+
_archived_basic_type_mirror_indices[t] = index;
243+
}
244+
245+
void Universe::update_archived_basic_type_mirrors() {
246+
if (ArchiveHeapLoader::are_archived_mirrors_available()) {
245247
for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
246-
if (f->reading()) {
247-
f->do_oop(&mirror_oop); // read from archive
248-
assert(oopDesc::is_oop_or_null(mirror_oop), "is oop");
249-
// Only create an OopHandle for non-null mirrors
250-
if (mirror_oop != NULL) {
251-
_mirrors[i] = OopHandle(vm_global(), mirror_oop);
252-
}
253-
} else {
254-
if (HeapShared::can_write()) {
255-
mirror_oop = _mirrors[i].resolve();
256-
} else {
257-
mirror_oop = NULL;
258-
}
259-
f->do_oop(&mirror_oop); // write to archive
248+
int index = _archived_basic_type_mirror_indices[i];
249+
if (!is_reference_type((BasicType)i) && index >= 0) {
250+
oop mirror_oop = HeapShared::get_root(index);
251+
assert(mirror_oop != NULL, "must be");
252+
_basic_type_mirrors[i] = OopHandle(vm_global(), mirror_oop);
260253
}
261254
}
262255
}
256+
}
257+
#endif
258+
259+
void Universe::serialize(SerializeClosure* f) {
260+
261+
#if INCLUDE_CDS_JAVA_HEAP
262+
for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
263+
f->do_u4((u4*)&_archived_basic_type_mirror_indices[i]);
264+
// if f->reading(): We can't call HeapShared::get_root() yet, as the heap
265+
// contents may need to be relocated. _basic_type_mirrors[i] will be
266+
// updated later in Universe::update_archived_basic_type_mirrors().
267+
}
263268
#endif
264269

265270
f->do_ptr((void**)&_fillerArrayKlassObj);
@@ -450,26 +455,27 @@ void Universe::initialize_basic_type_mirrors(TRAPS) {
450455
#if INCLUDE_CDS_JAVA_HEAP
451456
if (UseSharedSpaces &&
452457
ArchiveHeapLoader::are_archived_mirrors_available() &&
453-
_mirrors[T_INT].resolve() != NULL) {
458+
_basic_type_mirrors[T_INT].resolve() != NULL) {
454459
assert(ArchiveHeapLoader::can_use(), "Sanity");
455460

456-
// check that all mirrors are mapped also
461+
// check that all basic type mirrors are mapped also
457462
for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
458463
if (!is_reference_type((BasicType)i)) {
459-
oop m = _mirrors[i].resolve();
464+
oop m = _basic_type_mirrors[i].resolve();
460465
assert(m != NULL, "archived mirrors should not be NULL");
461466
}
462467
}
463468
} else
464-
// _mirror[T_INT} could be NULL if archived heap is not mapped.
469+
// _basic_type_mirrors[T_INT], etc, are NULL if archived heap is not mapped.
465470
#endif
466471
{
467472
for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
468473
BasicType bt = (BasicType)i;
469474
if (!is_reference_type(bt)) {
470475
oop m = java_lang_Class::create_basic_type_mirror(type2name(bt), bt, CHECK);
471-
_mirrors[i] = OopHandle(vm_global(), m);
476+
_basic_type_mirrors[i] = OopHandle(vm_global(), m);
472477
}
478+
CDS_JAVA_HEAP_ONLY(_archived_basic_type_mirror_indices[i] = -1);
473479
}
474480
}
475481
}

src/hotspot/share/memory/universe.hpp

+15-5
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,16 @@ class Universe: AllStatic {
196196
static uintptr_t _verify_oop_mask;
197197
static uintptr_t _verify_oop_bits;
198198

199+
// Table of primitive type mirrors, excluding T_OBJECT and T_ARRAY
200+
// but including T_VOID, hence the index including T_VOID
201+
static OopHandle _basic_type_mirrors[T_VOID+1];
202+
203+
#if INCLUDE_CDS_JAVA_HEAP
204+
// Each slot i stores an index that can be used to restore _basic_type_mirrors[i]
205+
// from the archive heap using HeapShared::get_root(int)
206+
static int _archived_basic_type_mirror_indices[T_VOID+1];
207+
#endif
208+
199209
public:
200210
static void calculate_verify_data(HeapWord* low_boundary, HeapWord* high_boundary) PRODUCT_RETURN;
201211

@@ -231,12 +241,12 @@ class Universe: AllStatic {
231241
static oop short_mirror();
232242
static oop void_mirror();
233243

234-
// Table of primitive type mirrors, excluding T_OBJECT and T_ARRAY
235-
// but including T_VOID, hence the index including T_VOID
236-
static OopHandle _mirrors[T_VOID+1];
237-
238244
static oop java_mirror(BasicType t);
239-
static void replace_mirror(BasicType t, oop obj);
245+
246+
#if INCLUDE_CDS_JAVA_HEAP
247+
static void set_archived_basic_type_mirror_index(BasicType t, int index);
248+
static void update_archived_basic_type_mirrors();
249+
#endif
240250

241251
static oop main_thread_group();
242252
static void set_main_thread_group(oop group);

0 commit comments

Comments
 (0)