< prev index next >

src/hotspot/share/classfile/classLoaderData.cpp

Print this page


  42 //
  43 // Instances of java.lang.ClassLoader holds a pointer to a ClassLoaderData that
  44 // that represent the loader's "linking domain" in the JVM.
  45 //
  46 // The bootstrap loader (represented by NULL) also has a ClassLoaderData,
  47 // the singleton class the_null_class_loader_data().
  48 
  49 #include "precompiled.hpp"
  50 #include "classfile/classLoaderData.inline.hpp"
  51 #include "classfile/classLoaderDataGraph.inline.hpp"
  52 #include "classfile/dictionary.hpp"
  53 #include "classfile/javaClasses.hpp"
  54 #include "classfile/moduleEntry.hpp"
  55 #include "classfile/packageEntry.hpp"
  56 #include "classfile/symbolTable.hpp"
  57 #include "classfile/systemDictionary.hpp"
  58 #include "logging/log.hpp"
  59 #include "logging/logStream.hpp"
  60 #include "memory/allocation.inline.hpp"
  61 #include "memory/metadataFactory.hpp"
  62 #include "memory/metaspaceShared.hpp"
  63 #include "memory/iterator.hpp"
  64 #include "memory/resourceArea.hpp"
  65 #include "memory/universe.hpp"
  66 #include "oops/access.inline.hpp"
  67 #include "oops/array.hpp"
  68 #include "oops/oop.inline.hpp"
  69 #include "oops/oopHandle.inline.hpp"
  70 #include "oops/weakHandle.inline.hpp"
  71 #include "runtime/atomic.hpp"
  72 #include "runtime/handles.inline.hpp"
  73 #include "runtime/mutex.hpp"
  74 #include "runtime/safepoint.hpp"
  75 #include "utilities/growableArray.hpp"
  76 #include "utilities/macros.hpp"
  77 #include "utilities/ostream.hpp"
  78 
  79 
  80 #if INCLUDE_CDS_JAVA_HEAP
  81 // Support for archiving full module graph in CDS
  82 
  83 class ArchivedClassLoaderData {
  84   Array<PackageEntry*>* _packages;
  85   Array<ModuleEntry*>* _modules;
  86 
  87 public:
  88   ArchivedClassLoaderData() : _packages(NULL), _modules(NULL) {}
  89 
  90   void allocate(ClassLoaderData* loader_data);
  91   void init_archived_entries(ClassLoaderData* loader_data);
  92   void init_archived_oops(ClassLoaderData* loader_data);
  93 
  94   void serialize(SerializeClosure* f) {
  95     f->do_ptr((void**)&_packages);
  96     f->do_ptr((void**)&_modules);
  97   }
  98 
  99   void load_archived_entries(ClassLoaderData* loader_data);
 100   void restore_archived_oops(ClassLoaderData* loader_data);
 101 };
 102 
 103 static ArchivedClassLoaderData _archived_boot_loader_data;
 104 static ArchivedClassLoaderData _archived_platform_loader_data;
 105 static ArchivedClassLoaderData _archived_system_loader_data;
 106 static ModuleEntry* _archived_javabase_moduleEntry = NULL;
 107 
 108 void ArchivedClassLoaderData::allocate(ClassLoaderData* loader_data) {
 109   assert(DumpSharedSpaces, "must be");
 110 
 111   // We can't create a hashtable at dump time because the hashcode dependes on the
 112   // address of the Symbols, which may be relocated at run time due to ASLR.
 113   if (loader_data) {
 114     _packages = loader_data->packages()->allocate_archived_entries();
 115     _modules  = loader_data->modules() ->allocate_archived_entries();
 116   }
 117 }
 118 
 119 void ArchivedClassLoaderData::init_archived_entries(ClassLoaderData* loader_data) {
 120   assert(DumpSharedSpaces, "must be");
 121   if (loader_data) {
 122     loader_data->packages()->init_archived_entries(_packages);
 123     loader_data->modules() ->init_archived_entries(_modules);
 124   }
 125 }
 126 
 127 void ArchivedClassLoaderData::init_archived_oops(ClassLoaderData* loader_data) {
 128   assert(DumpSharedSpaces, "must be");
 129   if (loader_data) {
 130     loader_data->modules()->init_archived_oops(_modules);
 131   }
 132 }
 133 
 134 void ArchivedClassLoaderData::load_archived_entries(ClassLoaderData* loader_data) {
 135   assert(UseSharedSpaces, "must be");
 136   if (_modules) {
 137     loader_data->modules()->load_archived_entries(loader_data, _modules);
 138     loader_data->packages()->load_archived_entries(_packages);
 139   }
 140 }
 141 
 142 void ArchivedClassLoaderData::restore_archived_oops(ClassLoaderData* loader_data) {
 143   assert(UseSharedSpaces, "must be");
 144   if (_modules) {
 145     loader_data->modules()->restore_archived_oops(loader_data, _modules);
 146   }
 147 }
 148 
 149 // ------------------------------
 150 
 151 void ClassLoaderData::allocate_archived_tables() {
 152   assert(DumpSharedSpaces, "must be");
 153   if (MetaspaceShared::use_full_module_graph()) {
 154     _archived_boot_loader_data.allocate    (_the_null_class_loader_data);
 155     _archived_platform_loader_data.allocate(class_loader_data_or_null(SystemDictionary::java_platform_loader()));
 156     _archived_system_loader_data.allocate  (class_loader_data_or_null(SystemDictionary::java_system_loader()));
 157   }
 158 }
 159 
 160 void ClassLoaderData::init_archived_tables() {
 161   assert(DumpSharedSpaces, "must be");
 162   if (MetaspaceShared::use_full_module_graph()) {
 163     _archived_boot_loader_data.init_archived_entries    (_the_null_class_loader_data);
 164     _archived_platform_loader_data.init_archived_entries(class_loader_data_or_null(SystemDictionary::java_platform_loader()));
 165     _archived_system_loader_data.init_archived_entries  (class_loader_data_or_null(SystemDictionary::java_system_loader()));
 166     _archived_javabase_moduleEntry = ModuleEntry::get_archived_entry(ModuleEntryTable::javabase_moduleEntry());
 167   }
 168 }
 169 
 170 void ClassLoaderData::init_archived_oops() {
 171   assert(DumpSharedSpaces, "must be");
 172   if (MetaspaceShared::use_full_module_graph()) {
 173     _archived_boot_loader_data.init_archived_oops    (_the_null_class_loader_data);
 174     _archived_platform_loader_data.init_archived_oops(class_loader_data_or_null(SystemDictionary::java_platform_loader()));
 175     _archived_system_loader_data.init_archived_oops  (class_loader_data_or_null(SystemDictionary::java_system_loader()));
 176   }
 177 }
 178 
 179 void ClassLoaderData::serialize(class SerializeClosure* f) {
 180   _archived_boot_loader_data.serialize(f);
 181   _archived_platform_loader_data.serialize(f);
 182   _archived_system_loader_data.serialize(f);
 183   f->do_ptr((void**)&_archived_javabase_moduleEntry);
 184 
 185   if (f->reading() && MetaspaceShared::use_full_module_graph()) {
 186     // Must be done before ClassLoader::create_javabase()
 187     _archived_boot_loader_data.load_archived_entries(_the_null_class_loader_data);
 188     ModuleEntryTable::set_javabase_moduleEntry(_archived_javabase_moduleEntry);
 189     log_info(cds)("use_full_module_graph = true; java.base = " INTPTR_FORMAT,
 190                   p2i(_archived_javabase_moduleEntry));
 191   }
 192 }
 193 
 194 void ClassLoaderData::restore_archived_oops_for_null_class_loader_data() {
 195   assert(UseSharedSpaces, "must be");
 196   if (MetaspaceShared::use_full_module_graph()) {
 197     _archived_boot_loader_data.restore_archived_oops(_the_null_class_loader_data);
 198   }
 199 }
 200 
 201 void ClassLoaderData::restore_java_platform_loader_from_archive() {
 202   assert(UseSharedSpaces, "must be");
 203   assert(MetaspaceShared::use_full_module_graph(), "must be");
 204   assert(class_loader() == SystemDictionary::java_platform_loader(), "must be");
 205   _archived_platform_loader_data.load_archived_entries(this);
 206   _archived_platform_loader_data.restore_archived_oops(this);
 207 }
 208 
 209 void ClassLoaderData::restore_java_system_loader_from_archive() {
 210   assert(UseSharedSpaces, "must be");
 211   assert(MetaspaceShared::use_full_module_graph(), "must be");
 212   assert(class_loader() == SystemDictionary::java_system_loader(), "must be");
 213   _archived_system_loader_data.load_archived_entries(this);
 214   _archived_system_loader_data.restore_archived_oops(this);
 215 }
 216 
 217 #endif // INCLUDE_JAVA_HEAP
 218 
 219 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
 220 
 221 void ClassLoaderData::init_null_class_loader_data() {
 222   assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
 223   assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
 224 
 225   _the_null_class_loader_data = new ClassLoaderData(Handle(), false);
 226   ClassLoaderDataGraph::_head = _the_null_class_loader_data;
 227   assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
 228 
 229   LogTarget(Trace, class, loader, data) lt;
 230   if (lt.is_enabled()) {
 231     ResourceMark rm;
 232     LogStream ls(lt);
 233     ls.print("create ");
 234     _the_null_class_loader_data->print_value_on(&ls);
 235     ls.cr();
 236   }
 237 }




  42 //
  43 // Instances of java.lang.ClassLoader holds a pointer to a ClassLoaderData that
  44 // that represent the loader's "linking domain" in the JVM.
  45 //
  46 // The bootstrap loader (represented by NULL) also has a ClassLoaderData,
  47 // the singleton class the_null_class_loader_data().
  48 
  49 #include "precompiled.hpp"
  50 #include "classfile/classLoaderData.inline.hpp"
  51 #include "classfile/classLoaderDataGraph.inline.hpp"
  52 #include "classfile/dictionary.hpp"
  53 #include "classfile/javaClasses.hpp"
  54 #include "classfile/moduleEntry.hpp"
  55 #include "classfile/packageEntry.hpp"
  56 #include "classfile/symbolTable.hpp"
  57 #include "classfile/systemDictionary.hpp"
  58 #include "logging/log.hpp"
  59 #include "logging/logStream.hpp"
  60 #include "memory/allocation.inline.hpp"
  61 #include "memory/metadataFactory.hpp"

  62 #include "memory/iterator.hpp"
  63 #include "memory/resourceArea.hpp"
  64 #include "memory/universe.hpp"
  65 #include "oops/access.inline.hpp"
  66 #include "oops/array.hpp"
  67 #include "oops/oop.inline.hpp"
  68 #include "oops/oopHandle.inline.hpp"
  69 #include "oops/weakHandle.inline.hpp"
  70 #include "runtime/atomic.hpp"
  71 #include "runtime/handles.inline.hpp"
  72 #include "runtime/mutex.hpp"
  73 #include "runtime/safepoint.hpp"
  74 #include "utilities/growableArray.hpp"
  75 #include "utilities/macros.hpp"
  76 #include "utilities/ostream.hpp"












































































































































  77 
  78 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
  79 
  80 void ClassLoaderData::init_null_class_loader_data() {
  81   assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
  82   assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
  83 
  84   _the_null_class_loader_data = new ClassLoaderData(Handle(), false);
  85   ClassLoaderDataGraph::_head = _the_null_class_loader_data;
  86   assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
  87 
  88   LogTarget(Trace, class, loader, data) lt;
  89   if (lt.is_enabled()) {
  90     ResourceMark rm;
  91     LogStream ls(lt);
  92     ls.print("create ");
  93     _the_null_class_loader_data->print_value_on(&ls);
  94     ls.cr();
  95   }
  96 }


< prev index next >