1 /* 2 * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "classfile/classLoaderData.inline.hpp" 27 #include "classfile/classLoaderDataShared.hpp" 28 #include "classfile/moduleEntry.hpp" 29 #include "classfile/packageEntry.hpp" 30 #include "logging/log.hpp" 31 #include "memory/metaspaceShared.hpp" 32 33 class ArchivedClassLoaderData { 34 Array<PackageEntry*>* _packages; 35 Array<ModuleEntry*>* _modules; 36 37 void assert_valid(ClassLoaderData* loader_data) { 38 // loader_data may be NULL if the boot layer has loaded no modules for the platform or 39 // system loaders (e.g., if you create a custom JDK image with only java.base). 40 if (loader_data != NULL) { 41 assert(!loader_data->has_class_mirror_holder(), 42 "loaders for non-strong hidden classes or unsafe anonymous classes not supported"); 43 } 44 } 45 public: 46 ArchivedClassLoaderData() : _packages(NULL), _modules(NULL) {} 47 48 void allocate(ClassLoaderData* loader_data); 49 void init_archived_entries(ClassLoaderData* loader_data); 50 void init_archived_oops(ClassLoaderData* loader_data); 51 52 void serialize(SerializeClosure* f) { 53 f->do_ptr((void**)&_packages); 54 f->do_ptr((void**)&_modules); 55 } 56 57 void restore(ClassLoaderData* loader_data, bool do_entries, bool do_oops); 58 }; 59 60 static ArchivedClassLoaderData _archived_boot_loader_data; 61 static ArchivedClassLoaderData _archived_platform_loader_data; 62 static ArchivedClassLoaderData _archived_system_loader_data; 63 static ModuleEntry* _archived_javabase_moduleEntry = NULL; 64 65 void ArchivedClassLoaderData::allocate(ClassLoaderData* loader_data) { 66 assert(DumpSharedSpaces, "must be"); 67 assert_valid(loader_data); 68 if (loader_data != NULL) { 69 // We can't create a hashtable at dump time because the hashcode dependes on the 70 // address of the Symbols, which may be relocated at run time due to ASLR. 71 _packages = loader_data->packages()->allocate_archived_entries(); 72 _modules = loader_data->modules() ->allocate_archived_entries(); 73 } 74 } 75 76 void ArchivedClassLoaderData::init_archived_entries(ClassLoaderData* loader_data) { 77 assert(DumpSharedSpaces, "must be"); 78 assert_valid(loader_data); 79 if (loader_data != NULL) { 80 loader_data->packages()->init_archived_entries(_packages); 81 loader_data->modules() ->init_archived_entries(_modules); 82 } 83 } 84 85 void ArchivedClassLoaderData::init_archived_oops(ClassLoaderData* loader_data) { 86 assert(DumpSharedSpaces, "must be"); 87 assert_valid(loader_data); 88 if (loader_data != NULL) { 89 loader_data->modules()->init_archived_oops(_modules); 90 } 91 } 92 93 void ArchivedClassLoaderData::restore(ClassLoaderData* loader_data, bool do_entries, bool do_oops) { 94 assert(UseSharedSpaces, "must be"); 95 assert_valid(loader_data); 96 if (_modules != NULL) { // Could be NULL if we have archived no modules for platform/system loaders 97 ModuleEntryTable* modules = loader_data->modules(); 98 PackageEntryTable* packages = loader_data->packages(); 99 100 MutexLocker m1(Module_lock); 101 if (do_entries) { 102 modules->load_archived_entries(loader_data, _modules); 103 packages->load_archived_entries(_packages); 104 } 105 if (do_oops) { 106 modules->restore_archived_oops(loader_data, _modules); 107 } 108 } 109 } 110 111 // ------------------------------ 112 113 ClassLoaderData* ClassLoaderDataShared::null_class_loader_data() { 114 ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); 115 assert(loader_data != NULL, "must be"); 116 return loader_data; 117 } 118 119 ClassLoaderData* ClassLoaderDataShared::java_platform_loader_data_or_null() { 120 return ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_platform_loader()); 121 } 122 123 ClassLoaderData* ClassLoaderDataShared::java_system_loader_data_or_null() { 124 return ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_system_loader()); 125 } 126 127 void ClassLoaderDataShared::allocate_archived_tables() { 128 assert(DumpSharedSpaces, "must be"); 129 if (MetaspaceShared::use_full_module_graph()) { 130 _archived_boot_loader_data.allocate (null_class_loader_data()); 131 _archived_platform_loader_data.allocate(java_platform_loader_data_or_null()); 132 _archived_system_loader_data.allocate (java_system_loader_data_or_null()); 133 } 134 } 135 136 void ClassLoaderDataShared::init_archived_tables() { 137 assert(DumpSharedSpaces, "must be"); 138 if (MetaspaceShared::use_full_module_graph()) { 139 _archived_boot_loader_data.init_archived_entries (null_class_loader_data()); 140 _archived_platform_loader_data.init_archived_entries(java_platform_loader_data_or_null()); 141 _archived_system_loader_data.init_archived_entries (java_system_loader_data_or_null()); 142 _archived_javabase_moduleEntry = ModuleEntry::get_archived_entry(ModuleEntryTable::javabase_moduleEntry()); 143 } 144 } 145 146 void ClassLoaderDataShared::init_archived_oops() { 147 assert(DumpSharedSpaces, "must be"); 148 if (MetaspaceShared::use_full_module_graph()) { 149 _archived_boot_loader_data.init_archived_oops (null_class_loader_data()); 150 _archived_platform_loader_data.init_archived_oops(java_platform_loader_data_or_null()); 151 _archived_system_loader_data.init_archived_oops (java_system_loader_data_or_null()); 152 } 153 } 154 155 void ClassLoaderDataShared::serialize(class SerializeClosure* f) { 156 _archived_boot_loader_data.serialize(f); 157 _archived_platform_loader_data.serialize(f); 158 _archived_system_loader_data.serialize(f); 159 f->do_ptr((void**)&_archived_javabase_moduleEntry); 160 161 if (f->reading() && MetaspaceShared::use_full_module_graph()) { 162 // Must be done before ClassLoader::create_javabase() 163 _archived_boot_loader_data.restore(null_class_loader_data(), true, false); 164 ModuleEntryTable::set_javabase_moduleEntry(_archived_javabase_moduleEntry); 165 log_info(cds)("use_full_module_graph = true; java.base = " INTPTR_FORMAT, 166 p2i(_archived_javabase_moduleEntry)); 167 } 168 } 169 170 void ClassLoaderDataShared::restore_archived_oops_for_null_class_loader_data() { 171 assert(UseSharedSpaces, "must be"); 172 if (MetaspaceShared::use_full_module_graph()) { 173 _archived_boot_loader_data.restore(null_class_loader_data(), false, true); 174 } 175 } 176 177 void ClassLoaderDataShared::restore_java_platform_loader_from_archive(ClassLoaderData* loader_data) { 178 assert(UseSharedSpaces, "must be"); 179 assert(MetaspaceShared::use_full_module_graph(), "must be"); 180 _archived_platform_loader_data.restore(loader_data, true, true); 181 } 182 183 void ClassLoaderDataShared::restore_java_system_loader_from_archive(ClassLoaderData* loader_data) { 184 assert(UseSharedSpaces, "must be"); 185 assert(MetaspaceShared::use_full_module_graph(), "must be"); 186 _archived_system_loader_data.restore(loader_data, true, true); 187 }