src/hotspot/share/memory/universe.cpp
changeset 59070 22ee476cc664
parent 59053 ba6c248cae19
child 59249 29b0d0b61615
equal deleted inserted replaced
59069:e0d59f0c2b7d 59070:22ee476cc664
    83 #include "utilities/hashtable.inline.hpp"
    83 #include "utilities/hashtable.inline.hpp"
    84 #include "utilities/macros.hpp"
    84 #include "utilities/macros.hpp"
    85 #include "utilities/ostream.hpp"
    85 #include "utilities/ostream.hpp"
    86 #include "utilities/preserveException.hpp"
    86 #include "utilities/preserveException.hpp"
    87 
    87 
       
    88 #define PRIMITIVE_MIRRORS_DO(func) \
       
    89   func(_int_mirror)    \
       
    90   func(_float_mirror)  \
       
    91   func(_double_mirror) \
       
    92   func(_byte_mirror)   \
       
    93   func(_bool_mirror)   \
       
    94   func(_char_mirror)   \
       
    95   func(_long_mirror)   \
       
    96   func(_short_mirror)  \
       
    97   func(_void_mirror)
       
    98 
       
    99 #define DEFINE_PRIMITIVE_MIRROR(m) \
       
   100     oop Universe::m  = NULL;
       
   101 
    88 // Known objects
   102 // Known objects
       
   103 PRIMITIVE_MIRRORS_DO(DEFINE_PRIMITIVE_MIRROR)
    89 Klass* Universe::_typeArrayKlassObjs[T_LONG+1]        = { NULL /*, NULL...*/ };
   104 Klass* Universe::_typeArrayKlassObjs[T_LONG+1]        = { NULL /*, NULL...*/ };
    90 Klass* Universe::_objectArrayKlassObj                 = NULL;
   105 Klass* Universe::_objectArrayKlassObj                 = NULL;
    91 oop Universe::_int_mirror                             = NULL;
       
    92 oop Universe::_float_mirror                           = NULL;
       
    93 oop Universe::_double_mirror                          = NULL;
       
    94 oop Universe::_byte_mirror                            = NULL;
       
    95 oop Universe::_bool_mirror                            = NULL;
       
    96 oop Universe::_char_mirror                            = NULL;
       
    97 oop Universe::_long_mirror                            = NULL;
       
    98 oop Universe::_short_mirror                           = NULL;
       
    99 oop Universe::_void_mirror                            = NULL;
       
   100 oop Universe::_mirrors[T_VOID+1]                      = { NULL /*, NULL...*/ };
   106 oop Universe::_mirrors[T_VOID+1]                      = { NULL /*, NULL...*/ };
   101 oop Universe::_main_thread_group                      = NULL;
   107 oop Universe::_main_thread_group                      = NULL;
   102 oop Universe::_system_thread_group                    = NULL;
   108 oop Universe::_system_thread_group                    = NULL;
   103 objArrayOop Universe::_the_empty_class_klass_array    = NULL;
   109 objArrayOop Universe::_the_empty_class_klass_array    = NULL;
   104 Array<Klass*>* Universe::_the_array_interfaces_array = NULL;
   110 Array<Klass*>* Universe::_the_array_interfaces_array = NULL;
   165   for (int i = T_BOOLEAN; i < T_LONG+1; i++) {
   171   for (int i = T_BOOLEAN; i < T_LONG+1; i++) {
   166     closure->do_klass(_typeArrayKlassObjs[i]);
   172     closure->do_klass(_typeArrayKlassObjs[i]);
   167   }
   173   }
   168 }
   174 }
   169 
   175 
       
   176 #define DO_PRIMITIVE_MIRROR(m) \
       
   177   f->do_oop((oop*) &m);
       
   178 
   170 void Universe::oops_do(OopClosure* f) {
   179 void Universe::oops_do(OopClosure* f) {
   171 
   180   PRIMITIVE_MIRRORS_DO(DO_PRIMITIVE_MIRROR);
   172   f->do_oop((oop*) &_int_mirror);
       
   173   f->do_oop((oop*) &_float_mirror);
       
   174   f->do_oop((oop*) &_double_mirror);
       
   175   f->do_oop((oop*) &_byte_mirror);
       
   176   f->do_oop((oop*) &_bool_mirror);
       
   177   f->do_oop((oop*) &_char_mirror);
       
   178   f->do_oop((oop*) &_long_mirror);
       
   179   f->do_oop((oop*) &_short_mirror);
       
   180   f->do_oop((oop*) &_void_mirror);
       
   181 
   181 
   182   for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
   182   for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
   183     f->do_oop((oop*) &_mirrors[i]);
   183     f->do_oop((oop*) &_mirrors[i]);
   184   }
   184   }
   185   assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");
   185   assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");
   229   _throw_illegal_access_error_cache->metaspace_pointers_do(it);
   229   _throw_illegal_access_error_cache->metaspace_pointers_do(it);
   230   _throw_no_such_method_error_cache->metaspace_pointers_do(it);
   230   _throw_no_such_method_error_cache->metaspace_pointers_do(it);
   231   _do_stack_walk_cache->metaspace_pointers_do(it);
   231   _do_stack_walk_cache->metaspace_pointers_do(it);
   232 }
   232 }
   233 
   233 
       
   234 #define ASSERT_MIRROR_NULL(m) \
       
   235   assert(m == NULL, "archived mirrors should be NULL");
       
   236 
       
   237 #define SERIALIZE_MIRROR(m) \
       
   238   f->do_oop(&m); \
       
   239   if (m != NULL) { java_lang_Class::update_archived_primitive_mirror_native_pointers(m); }
       
   240 
   234 // Serialize metadata and pointers to primitive type mirrors in and out of CDS archive
   241 // Serialize metadata and pointers to primitive type mirrors in and out of CDS archive
   235 void Universe::serialize(SerializeClosure* f) {
   242 void Universe::serialize(SerializeClosure* f) {
   236 
   243 
   237   for (int i = 0; i < T_LONG+1; i++) {
   244   for (int i = 0; i < T_LONG+1; i++) {
   238     f->do_ptr((void**)&_typeArrayKlassObjs[i]);
   245     f->do_ptr((void**)&_typeArrayKlassObjs[i]);
   239   }
   246   }
   240 
   247 
   241   f->do_ptr((void**)&_objectArrayKlassObj);
   248   f->do_ptr((void**)&_objectArrayKlassObj);
       
   249 
   242 #if INCLUDE_CDS_JAVA_HEAP
   250 #if INCLUDE_CDS_JAVA_HEAP
   243 #ifdef ASSERT
   251   DEBUG_ONLY(if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) {
   244   if (DumpSharedSpaces && !HeapShared::is_heap_object_archiving_allowed()) {
   252       PRIMITIVE_MIRRORS_DO(ASSERT_MIRROR_NULL);
   245     assert(_int_mirror == NULL    && _float_mirror == NULL &&
   253     });
   246            _double_mirror == NULL && _byte_mirror == NULL  &&
   254   PRIMITIVE_MIRRORS_DO(SERIALIZE_MIRROR);
   247            _bool_mirror == NULL   && _char_mirror == NULL  &&
       
   248            _long_mirror == NULL   && _short_mirror == NULL &&
       
   249            _void_mirror == NULL, "mirrors should be NULL");
       
   250   }
       
   251 #endif
       
   252   f->do_oop(&_int_mirror);
       
   253   f->do_oop(&_float_mirror);
       
   254   f->do_oop(&_double_mirror);
       
   255   f->do_oop(&_byte_mirror);
       
   256   f->do_oop(&_bool_mirror);
       
   257   f->do_oop(&_char_mirror);
       
   258   f->do_oop(&_long_mirror);
       
   259   f->do_oop(&_short_mirror);
       
   260   f->do_oop(&_void_mirror);
       
   261 #endif
   255 #endif
   262 
   256 
   263   f->do_ptr((void**)&_the_array_interfaces_array);
   257   f->do_ptr((void**)&_the_array_interfaces_array);
   264   f->do_ptr((void**)&_the_empty_int_array);
   258   f->do_ptr((void**)&_the_empty_int_array);
   265   f->do_ptr((void**)&_the_empty_short_array);
   259   f->do_ptr((void**)&_the_empty_short_array);
   417     assert(i == _fullgc_alot_dummy_array->length(), "just checking");
   411     assert(i == _fullgc_alot_dummy_array->length(), "just checking");
   418   }
   412   }
   419   #endif
   413   #endif
   420 }
   414 }
   421 
   415 
       
   416 #define ASSERT_MIRROR_NOT_NULL(m) \
       
   417   assert(m != NULL, "archived mirrors should not be NULL");
       
   418 
   422 void Universe::initialize_basic_type_mirrors(TRAPS) {
   419 void Universe::initialize_basic_type_mirrors(TRAPS) {
   423 #if INCLUDE_CDS_JAVA_HEAP
   420 #if INCLUDE_CDS_JAVA_HEAP
   424     if (UseSharedSpaces &&
   421     if (UseSharedSpaces &&
   425         HeapShared::open_archive_heap_region_mapped() &&
   422         HeapShared::open_archive_heap_region_mapped() &&
   426         _int_mirror != NULL) {
   423         _int_mirror != NULL) {
   427       assert(HeapShared::is_heap_object_archiving_allowed(), "Sanity");
   424       assert(HeapShared::is_heap_object_archiving_allowed(), "Sanity");
   428       assert(_float_mirror != NULL && _double_mirror != NULL &&
   425       PRIMITIVE_MIRRORS_DO(ASSERT_MIRROR_NOT_NULL);
   429              _byte_mirror  != NULL && _byte_mirror   != NULL &&
       
   430              _bool_mirror  != NULL && _char_mirror   != NULL &&
       
   431              _long_mirror  != NULL && _short_mirror  != NULL &&
       
   432              _void_mirror  != NULL, "Sanity");
       
   433     } else
   426     } else
       
   427       // _int_mirror could be NULL if archived heap is not mapped.
   434 #endif
   428 #endif
   435     {
   429     {
   436       _int_mirror     =
   430       _int_mirror     =
   437         java_lang_Class::create_basic_type_mirror("int",    T_INT, CHECK);
   431         java_lang_Class::create_basic_type_mirror("int",    T_INT, CHECK);
   438       _float_mirror   =
   432       _float_mirror   =