Path: blob/master/src/hotspot/share/classfile/classLoaderDataShared.cpp
40949 views
/*1* Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "cds/metaspaceShared.hpp"26#include "classfile/classLoaderData.inline.hpp"27#include "classfile/classLoaderDataShared.hpp"28#include "classfile/moduleEntry.hpp"29#include "classfile/packageEntry.hpp"30#include "classfile/systemDictionary.hpp"31#include "logging/log.hpp"32#include "runtime/handles.inline.hpp"3334#if INCLUDE_CDS_JAVA_HEAP3536bool ClassLoaderDataShared::_full_module_graph_loaded = false;3738class ArchivedClassLoaderData {39Array<PackageEntry*>* _packages;40Array<ModuleEntry*>* _modules;4142void assert_valid(ClassLoaderData* loader_data) {43// loader_data may be NULL if the boot layer has loaded no modules for the platform or44// system loaders (e.g., if you create a custom JDK image with only java.base).45if (loader_data != NULL) {46assert(!loader_data->has_class_mirror_holder(),47"loaders for non-strong hidden classes not supported");48}49}50public:51ArchivedClassLoaderData() : _packages(NULL), _modules(NULL) {}5253void iterate_symbols(ClassLoaderData* loader_data, MetaspaceClosure* closure);54void allocate(ClassLoaderData* loader_data);55void init_archived_entries(ClassLoaderData* loader_data);56void init_archived_oops(ClassLoaderData* loader_data);5758void serialize(SerializeClosure* f) {59f->do_ptr((void**)&_packages);60f->do_ptr((void**)&_modules);61}6263void restore(ClassLoaderData* loader_data, bool do_entries, bool do_oops);64void clear_archived_oops();65};6667static ArchivedClassLoaderData _archived_boot_loader_data;68static ArchivedClassLoaderData _archived_platform_loader_data;69static ArchivedClassLoaderData _archived_system_loader_data;70static ModuleEntry* _archived_javabase_moduleEntry = NULL;7172void ArchivedClassLoaderData::iterate_symbols(ClassLoaderData* loader_data, MetaspaceClosure* closure) {73assert(DumpSharedSpaces, "must be");74assert_valid(loader_data);75if (loader_data != NULL) {76loader_data->packages()->iterate_symbols(closure);77loader_data->modules() ->iterate_symbols(closure);78}79}8081void ArchivedClassLoaderData::allocate(ClassLoaderData* loader_data) {82assert(DumpSharedSpaces, "must be");83assert_valid(loader_data);84if (loader_data != NULL) {85// We can't create hashtables at dump time because the hashcode depends on the86// address of the Symbols, which may be relocated at runtime due to ASLR.87// So we store the packages/modules in Arrays. At runtime, we create88// the hashtables using these arrays.89_packages = loader_data->packages()->allocate_archived_entries();90_modules = loader_data->modules() ->allocate_archived_entries();91}92}9394void ArchivedClassLoaderData::init_archived_entries(ClassLoaderData* loader_data) {95assert(DumpSharedSpaces, "must be");96assert_valid(loader_data);97if (loader_data != NULL) {98loader_data->packages()->init_archived_entries(_packages);99loader_data->modules() ->init_archived_entries(_modules);100}101}102103void ArchivedClassLoaderData::init_archived_oops(ClassLoaderData* loader_data) {104assert(DumpSharedSpaces, "must be");105assert_valid(loader_data);106if (loader_data != NULL) {107loader_data->modules()->init_archived_oops(_modules);108}109}110111void ArchivedClassLoaderData::restore(ClassLoaderData* loader_data, bool do_entries, bool do_oops) {112assert(UseSharedSpaces, "must be");113assert_valid(loader_data);114if (_modules != NULL) { // Could be NULL if we have archived no modules for platform/system loaders115ModuleEntryTable* modules = loader_data->modules();116PackageEntryTable* packages = loader_data->packages();117118MutexLocker m1(Module_lock);119if (do_entries) {120modules->load_archived_entries(loader_data, _modules);121packages->load_archived_entries(_packages);122}123if (do_oops) {124modules->restore_archived_oops(loader_data, _modules);125}126}127}128129void ArchivedClassLoaderData::clear_archived_oops() {130assert(UseSharedSpaces, "must be");131if (_modules != NULL) {132for (int i = 0; i < _modules->length(); i++) {133_modules->at(i)->clear_archived_oops();134}135}136}137138// ------------------------------139140static ClassLoaderData* null_class_loader_data() {141ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();142assert(loader_data != NULL, "must be");143return loader_data;144}145146static ClassLoaderData* java_platform_loader_data_or_null() {147return ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_platform_loader());148}149150static ClassLoaderData* java_system_loader_data_or_null() {151return ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_system_loader());152}153154void ClassLoaderDataShared::iterate_symbols(MetaspaceClosure* closure) {155assert(DumpSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");156_archived_boot_loader_data.iterate_symbols (null_class_loader_data(), closure);157_archived_platform_loader_data.iterate_symbols(java_platform_loader_data_or_null(), closure);158_archived_system_loader_data.iterate_symbols (java_system_loader_data_or_null(), closure);159}160161void ClassLoaderDataShared::allocate_archived_tables() {162assert(DumpSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");163_archived_boot_loader_data.allocate (null_class_loader_data());164_archived_platform_loader_data.allocate(java_platform_loader_data_or_null());165_archived_system_loader_data.allocate (java_system_loader_data_or_null());166}167168void ClassLoaderDataShared::init_archived_tables() {169assert(DumpSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");170_archived_boot_loader_data.init_archived_entries (null_class_loader_data());171_archived_platform_loader_data.init_archived_entries(java_platform_loader_data_or_null());172_archived_system_loader_data.init_archived_entries (java_system_loader_data_or_null());173_archived_javabase_moduleEntry = ModuleEntry::get_archived_entry(ModuleEntryTable::javabase_moduleEntry());174}175176void ClassLoaderDataShared::init_archived_oops() {177assert(DumpSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");178_archived_boot_loader_data.init_archived_oops (null_class_loader_data());179_archived_platform_loader_data.init_archived_oops(java_platform_loader_data_or_null());180_archived_system_loader_data.init_archived_oops (java_system_loader_data_or_null());181}182183void ClassLoaderDataShared::serialize(SerializeClosure* f) {184_archived_boot_loader_data.serialize(f);185_archived_platform_loader_data.serialize(f);186_archived_system_loader_data.serialize(f);187f->do_ptr((void**)&_archived_javabase_moduleEntry);188189if (f->reading() && MetaspaceShared::use_full_module_graph()) {190// Must be done before ClassLoader::create_javabase()191_archived_boot_loader_data.restore(null_class_loader_data(), true, false);192ModuleEntryTable::set_javabase_moduleEntry(_archived_javabase_moduleEntry);193log_info(cds)("use_full_module_graph = true; java.base = " INTPTR_FORMAT,194p2i(_archived_javabase_moduleEntry));195}196}197198void ClassLoaderDataShared::clear_archived_oops() {199assert(UseSharedSpaces && !MetaspaceShared::use_full_module_graph(), "must be");200_archived_boot_loader_data.clear_archived_oops();201_archived_platform_loader_data.clear_archived_oops();202_archived_system_loader_data.clear_archived_oops();203}204205oop ClassLoaderDataShared::restore_archived_oops_for_null_class_loader_data() {206assert(UseSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");207_archived_boot_loader_data.restore(null_class_loader_data(), false, true);208return _archived_javabase_moduleEntry->module();209}210211void ClassLoaderDataShared::restore_java_platform_loader_from_archive(ClassLoaderData* loader_data) {212assert(UseSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");213_archived_platform_loader_data.restore(loader_data, true, true);214}215216void ClassLoaderDataShared::restore_java_system_loader_from_archive(ClassLoaderData* loader_data) {217assert(UseSharedSpaces && MetaspaceShared::use_full_module_graph(), "must be");218_archived_system_loader_data.restore(loader_data, true, true);219_full_module_graph_loaded = true;220}221222#endif // INCLUDE_CDS_JAVA_HEAP223224225