--- a/src/hotspot/share/memory/universe.cpp Fri Mar 02 10:42:32 2018 -0800
+++ b/src/hotspot/share/memory/universe.cpp Fri Mar 02 17:25:55 2018 -0500
@@ -247,7 +247,7 @@
_do_stack_walk_cache->metaspace_pointers_do(it);
}
-// Serialize metadata in and out of CDS archive, not oops.
+// Serialize metadata and pointers to primitive type mirrors in and out of CDS archive
void Universe::serialize(SerializeClosure* f, bool do_all) {
f->do_ptr((void**)&_boolArrayKlassObj);
@@ -271,6 +271,20 @@
}
}
+#if INCLUDE_CDS_JAVA_HEAP
+ // The mirrors are NULL if MetaspaceShared::is_heap_object_archiving_allowed
+ // is false.
+ f->do_oop(&_int_mirror);
+ f->do_oop(&_float_mirror);
+ f->do_oop(&_double_mirror);
+ f->do_oop(&_byte_mirror);
+ f->do_oop(&_bool_mirror);
+ f->do_oop(&_char_mirror);
+ f->do_oop(&_long_mirror);
+ f->do_oop(&_short_mirror);
+ f->do_oop(&_void_mirror);
+#endif
+
f->do_ptr((void**)&_the_array_interfaces_array);
f->do_ptr((void**)&_the_empty_int_array);
f->do_ptr((void**)&_the_empty_short_array);
@@ -453,25 +467,38 @@
}
void Universe::initialize_basic_type_mirrors(TRAPS) {
- assert(_int_mirror==NULL, "basic type mirrors already initialized");
- _int_mirror =
- java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK);
- _float_mirror =
- java_lang_Class::create_basic_type_mirror("float", T_FLOAT, CHECK);
- _double_mirror =
- java_lang_Class::create_basic_type_mirror("double", T_DOUBLE, CHECK);
- _byte_mirror =
- java_lang_Class::create_basic_type_mirror("byte", T_BYTE, CHECK);
- _bool_mirror =
- java_lang_Class::create_basic_type_mirror("boolean",T_BOOLEAN, CHECK);
- _char_mirror =
- java_lang_Class::create_basic_type_mirror("char", T_CHAR, CHECK);
- _long_mirror =
- java_lang_Class::create_basic_type_mirror("long", T_LONG, CHECK);
- _short_mirror =
- java_lang_Class::create_basic_type_mirror("short", T_SHORT, CHECK);
- _void_mirror =
- java_lang_Class::create_basic_type_mirror("void", T_VOID, CHECK);
+#if INCLUDE_CDS_JAVA_HEAP
+ if (UseSharedSpaces &&
+ MetaspaceShared::open_archive_heap_region_mapped() &&
+ _int_mirror != NULL) {
+ assert(MetaspaceShared::is_heap_object_archiving_allowed(), "Sanity");
+ assert(_float_mirror != NULL && _double_mirror != NULL &&
+ _byte_mirror != NULL && _byte_mirror != NULL &&
+ _bool_mirror != NULL && _char_mirror != NULL &&
+ _long_mirror != NULL && _short_mirror != NULL &&
+ _void_mirror != NULL, "Sanity");
+ } else
+#endif
+ {
+ _int_mirror =
+ java_lang_Class::create_basic_type_mirror("int", T_INT, CHECK);
+ _float_mirror =
+ java_lang_Class::create_basic_type_mirror("float", T_FLOAT, CHECK);
+ _double_mirror =
+ java_lang_Class::create_basic_type_mirror("double", T_DOUBLE, CHECK);
+ _byte_mirror =
+ java_lang_Class::create_basic_type_mirror("byte", T_BYTE, CHECK);
+ _bool_mirror =
+ java_lang_Class::create_basic_type_mirror("boolean",T_BOOLEAN, CHECK);
+ _char_mirror =
+ java_lang_Class::create_basic_type_mirror("char", T_CHAR, CHECK);
+ _long_mirror =
+ java_lang_Class::create_basic_type_mirror("long", T_LONG, CHECK);
+ _short_mirror =
+ java_lang_Class::create_basic_type_mirror("short", T_SHORT, CHECK);
+ _void_mirror =
+ java_lang_Class::create_basic_type_mirror("void", T_VOID, CHECK);
+ }
_mirrors[T_INT] = _int_mirror;
_mirrors[T_FLOAT] = _float_mirror;