Path: blob/master/src/hotspot/share/oops/klass.cpp
40951 views
/*1* Copyright (c) 1997, 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 "jvm_io.h"26#include "cds/heapShared.hpp"27#include "classfile/classLoaderData.inline.hpp"28#include "classfile/classLoaderDataGraph.inline.hpp"29#include "classfile/javaClasses.hpp"30#include "classfile/moduleEntry.hpp"31#include "classfile/systemDictionary.hpp"32#include "classfile/systemDictionaryShared.hpp"33#include "classfile/vmClasses.hpp"34#include "classfile/vmSymbols.hpp"35#include "gc/shared/collectedHeap.inline.hpp"36#include "logging/log.hpp"37#include "memory/metadataFactory.hpp"38#include "memory/metaspaceClosure.hpp"39#include "memory/oopFactory.hpp"40#include "memory/resourceArea.hpp"41#include "memory/universe.hpp"42#include "oops/compressedOops.inline.hpp"43#include "oops/instanceKlass.hpp"44#include "oops/klass.inline.hpp"45#include "oops/oop.inline.hpp"46#include "oops/oopHandle.inline.hpp"47#include "prims/jvmtiExport.hpp"48#include "runtime/arguments.hpp"49#include "runtime/atomic.hpp"50#include "runtime/handles.inline.hpp"51#include "utilities/macros.hpp"52#include "utilities/powerOfTwo.hpp"53#include "utilities/stack.inline.hpp"5455void Klass::set_java_mirror(Handle m) {56assert(!m.is_null(), "New mirror should never be null.");57assert(_java_mirror.is_empty(), "should only be used to initialize mirror");58_java_mirror = class_loader_data()->add_handle(m);59}6061oop Klass::java_mirror_no_keepalive() const {62return _java_mirror.peek();63}6465void Klass::replace_java_mirror(oop mirror) {66_java_mirror.replace(mirror);67}6869bool Klass::is_cloneable() const {70return _access_flags.is_cloneable_fast() ||71is_subtype_of(vmClasses::Cloneable_klass());72}7374void Klass::set_is_cloneable() {75if (name() == vmSymbols::java_lang_invoke_MemberName()) {76assert(is_final(), "no subclasses allowed");77// MemberName cloning should not be intrinsified and always happen in JVM_Clone.78} else if (is_instance_klass() && InstanceKlass::cast(this)->reference_type() != REF_NONE) {79// Reference cloning should not be intrinsified and always happen in JVM_Clone.80} else {81_access_flags.set_is_cloneable_fast();82}83}8485void Klass::set_name(Symbol* n) {86_name = n;87if (_name != NULL) _name->increment_refcount();8889if (Arguments::is_dumping_archive() && is_instance_klass()) {90SystemDictionaryShared::init_dumptime_info(InstanceKlass::cast(this));91}92}9394bool Klass::is_subclass_of(const Klass* k) const {95// Run up the super chain and check96if (this == k) return true;9798Klass* t = const_cast<Klass*>(this)->super();99100while (t != NULL) {101if (t == k) return true;102t = t->super();103}104return false;105}106107void Klass::release_C_heap_structures() {108if (_name != NULL) _name->decrement_refcount();109}110111bool Klass::search_secondary_supers(Klass* k) const {112// Put some extra logic here out-of-line, before the search proper.113// This cuts down the size of the inline method.114115// This is necessary, since I am never in my own secondary_super list.116if (this == k)117return true;118// Scan the array-of-objects for a match119int cnt = secondary_supers()->length();120for (int i = 0; i < cnt; i++) {121if (secondary_supers()->at(i) == k) {122((Klass*)this)->set_secondary_super_cache(k);123return true;124}125}126return false;127}128129// Return self, except for abstract classes with exactly 1130// implementor. Then return the 1 concrete implementation.131Klass *Klass::up_cast_abstract() {132Klass *r = this;133while( r->is_abstract() ) { // Receiver is abstract?134Klass *s = r->subklass(); // Check for exactly 1 subklass135if (s == NULL || s->next_sibling() != NULL) // Oops; wrong count; give up136return this; // Return 'this' as a no-progress flag137r = s; // Loop till find concrete class138}139return r; // Return the 1 concrete class140}141142// Find LCA in class hierarchy143Klass *Klass::LCA( Klass *k2 ) {144Klass *k1 = this;145while( 1 ) {146if( k1->is_subtype_of(k2) ) return k2;147if( k2->is_subtype_of(k1) ) return k1;148k1 = k1->super();149k2 = k2->super();150}151}152153154void Klass::check_valid_for_instantiation(bool throwError, TRAPS) {155ResourceMark rm(THREAD);156THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError()157: vmSymbols::java_lang_InstantiationException(), external_name());158}159160161void Klass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {162ResourceMark rm(THREAD);163assert(s != NULL, "Throw NPE!");164THROW_MSG(vmSymbols::java_lang_ArrayStoreException(),165err_msg("arraycopy: source type %s is not an array", s->klass()->external_name()));166}167168169void Klass::initialize(TRAPS) {170ShouldNotReachHere();171}172173Klass* Klass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {174#ifdef ASSERT175tty->print_cr("Error: find_field called on a klass oop."176" Likely error: reflection method does not correctly"177" wrap return value in a mirror object.");178#endif179ShouldNotReachHere();180return NULL;181}182183Method* Klass::uncached_lookup_method(const Symbol* name, const Symbol* signature,184OverpassLookupMode overpass_mode,185PrivateLookupMode private_mode) const {186#ifdef ASSERT187tty->print_cr("Error: uncached_lookup_method called on a klass oop."188" Likely error: reflection method does not correctly"189" wrap return value in a mirror object.");190#endif191ShouldNotReachHere();192return NULL;193}194195void* Klass::operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw() {196return Metaspace::allocate(loader_data, word_size, MetaspaceObj::ClassType, THREAD);197}198199// "Normal" instantiation is preceeded by a MetaspaceObj allocation200// which zeros out memory - calloc equivalent.201// The constructor is also used from CppVtableCloner,202// which doesn't zero out the memory before calling the constructor.203Klass::Klass(KlassID id) : _id(id),204_prototype_header(markWord::prototype()),205_shared_class_path_index(-1) {206CDS_ONLY(_shared_class_flags = 0;)207CDS_JAVA_HEAP_ONLY(_archived_mirror_index = -1;)208_primary_supers[0] = this;209set_super_check_offset(in_bytes(primary_supers_offset()));210}211212jint Klass::array_layout_helper(BasicType etype) {213assert(etype >= T_BOOLEAN && etype <= T_OBJECT, "valid etype");214// Note that T_ARRAY is not allowed here.215int hsize = arrayOopDesc::base_offset_in_bytes(etype);216int esize = type2aelembytes(etype);217bool isobj = (etype == T_OBJECT);218int tag = isobj ? _lh_array_tag_obj_value : _lh_array_tag_type_value;219int lh = array_layout_helper(tag, hsize, etype, exact_log2(esize));220221assert(lh < (int)_lh_neutral_value, "must look like an array layout");222assert(layout_helper_is_array(lh), "correct kind");223assert(layout_helper_is_objArray(lh) == isobj, "correct kind");224assert(layout_helper_is_typeArray(lh) == !isobj, "correct kind");225assert(layout_helper_header_size(lh) == hsize, "correct decode");226assert(layout_helper_element_type(lh) == etype, "correct decode");227assert(1 << layout_helper_log2_element_size(lh) == esize, "correct decode");228229return lh;230}231232bool Klass::can_be_primary_super_slow() const {233if (super() == NULL)234return true;235else if (super()->super_depth() >= primary_super_limit()-1)236return false;237else238return true;239}240241void Klass::initialize_supers(Klass* k, Array<InstanceKlass*>* transitive_interfaces, TRAPS) {242if (k == NULL) {243set_super(NULL);244_primary_supers[0] = this;245assert(super_depth() == 0, "Object must already be initialized properly");246} else if (k != super() || k == vmClasses::Object_klass()) {247assert(super() == NULL || super() == vmClasses::Object_klass(),248"initialize this only once to a non-trivial value");249set_super(k);250Klass* sup = k;251int sup_depth = sup->super_depth();252juint my_depth = MIN2(sup_depth + 1, (int)primary_super_limit());253if (!can_be_primary_super_slow())254my_depth = primary_super_limit();255for (juint i = 0; i < my_depth; i++) {256_primary_supers[i] = sup->_primary_supers[i];257}258Klass* *super_check_cell;259if (my_depth < primary_super_limit()) {260_primary_supers[my_depth] = this;261super_check_cell = &_primary_supers[my_depth];262} else {263// Overflow of the primary_supers array forces me to be secondary.264super_check_cell = &_secondary_super_cache;265}266set_super_check_offset((address)super_check_cell - (address) this);267268#ifdef ASSERT269{270juint j = super_depth();271assert(j == my_depth, "computed accessor gets right answer");272Klass* t = this;273while (!t->can_be_primary_super()) {274t = t->super();275j = t->super_depth();276}277for (juint j1 = j+1; j1 < primary_super_limit(); j1++) {278assert(primary_super_of_depth(j1) == NULL, "super list padding");279}280while (t != NULL) {281assert(primary_super_of_depth(j) == t, "super list initialization");282t = t->super();283--j;284}285assert(j == (juint)-1, "correct depth count");286}287#endif288}289290if (secondary_supers() == NULL) {291292// Now compute the list of secondary supertypes.293// Secondaries can occasionally be on the super chain,294// if the inline "_primary_supers" array overflows.295int extras = 0;296Klass* p;297for (p = super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) {298++extras;299}300301ResourceMark rm(THREAD); // need to reclaim GrowableArrays allocated below302303// Compute the "real" non-extra secondaries.304GrowableArray<Klass*>* secondaries = compute_secondary_supers(extras, transitive_interfaces);305if (secondaries == NULL) {306// secondary_supers set by compute_secondary_supers307return;308}309310GrowableArray<Klass*>* primaries = new GrowableArray<Klass*>(extras);311312for (p = super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) {313int i; // Scan for overflow primaries being duplicates of 2nd'arys314315// This happens frequently for very deeply nested arrays: the316// primary superclass chain overflows into the secondary. The317// secondary list contains the element_klass's secondaries with318// an extra array dimension added. If the element_klass's319// secondary list already contains some primary overflows, they320// (with the extra level of array-ness) will collide with the321// normal primary superclass overflows.322for( i = 0; i < secondaries->length(); i++ ) {323if( secondaries->at(i) == p )324break;325}326if( i < secondaries->length() )327continue; // It's a dup, don't put it in328primaries->push(p);329}330// Combine the two arrays into a metadata object to pack the array.331// The primaries are added in the reverse order, then the secondaries.332int new_length = primaries->length() + secondaries->length();333Array<Klass*>* s2 = MetadataFactory::new_array<Klass*>(334class_loader_data(), new_length, CHECK);335int fill_p = primaries->length();336for (int j = 0; j < fill_p; j++) {337s2->at_put(j, primaries->pop()); // add primaries in reverse order.338}339for( int j = 0; j < secondaries->length(); j++ ) {340s2->at_put(j+fill_p, secondaries->at(j)); // add secondaries on the end.341}342343#ifdef ASSERT344// We must not copy any NULL placeholders left over from bootstrap.345for (int j = 0; j < s2->length(); j++) {346assert(s2->at(j) != NULL, "correct bootstrapping order");347}348#endif349350set_secondary_supers(s2);351}352}353354GrowableArray<Klass*>* Klass::compute_secondary_supers(int num_extra_slots,355Array<InstanceKlass*>* transitive_interfaces) {356assert(num_extra_slots == 0, "override for complex klasses");357assert(transitive_interfaces == NULL, "sanity");358set_secondary_supers(Universe::the_empty_klass_array());359return NULL;360}361362363// superklass links364InstanceKlass* Klass::superklass() const {365assert(super() == NULL || super()->is_instance_klass(), "must be instance klass");366return _super == NULL ? NULL : InstanceKlass::cast(_super);367}368369// subklass links. Used by the compiler (and vtable initialization)370// May be cleaned concurrently, so must use the Compile_lock.371// The log parameter is for clean_weak_klass_links to report unlinked classes.372Klass* Klass::subklass(bool log) const {373// Need load_acquire on the _subklass, because it races with inserts that374// publishes freshly initialized data.375for (Klass* chain = Atomic::load_acquire(&_subklass);376chain != NULL;377// Do not need load_acquire on _next_sibling, because inserts never378// create _next_sibling edges to dead data.379chain = Atomic::load(&chain->_next_sibling))380{381if (chain->is_loader_alive()) {382return chain;383} else if (log) {384if (log_is_enabled(Trace, class, unload)) {385ResourceMark rm;386log_trace(class, unload)("unlinking class (subclass): %s", chain->external_name());387}388}389}390return NULL;391}392393Klass* Klass::next_sibling(bool log) const {394// Do not need load_acquire on _next_sibling, because inserts never395// create _next_sibling edges to dead data.396for (Klass* chain = Atomic::load(&_next_sibling);397chain != NULL;398chain = Atomic::load(&chain->_next_sibling)) {399// Only return alive klass, there may be stale klass400// in this chain if cleaned concurrently.401if (chain->is_loader_alive()) {402return chain;403} else if (log) {404if (log_is_enabled(Trace, class, unload)) {405ResourceMark rm;406log_trace(class, unload)("unlinking class (sibling): %s", chain->external_name());407}408}409}410return NULL;411}412413void Klass::set_subklass(Klass* s) {414assert(s != this, "sanity check");415Atomic::release_store(&_subklass, s);416}417418void Klass::set_next_sibling(Klass* s) {419assert(s != this, "sanity check");420// Does not need release semantics. If used by cleanup, it will link to421// already safely published data, and if used by inserts, will be published422// safely using cmpxchg.423Atomic::store(&_next_sibling, s);424}425426void Klass::append_to_sibling_list() {427if (Universe::is_fully_initialized()) {428assert_locked_or_safepoint(Compile_lock);429}430debug_only(verify();)431// add ourselves to superklass' subklass list432InstanceKlass* super = superklass();433if (super == NULL) return; // special case: class Object434assert((!super->is_interface() // interfaces cannot be supers435&& (super->superklass() == NULL || !is_interface())),436"an interface can only be a subklass of Object");437438// Make sure there is no stale subklass head439super->clean_subklass();440441for (;;) {442Klass* prev_first_subklass = Atomic::load_acquire(&_super->_subklass);443if (prev_first_subklass != NULL) {444// set our sibling to be the superklass' previous first subklass445assert(prev_first_subklass->is_loader_alive(), "May not attach not alive klasses");446set_next_sibling(prev_first_subklass);447}448// Note that the prev_first_subklass is always alive, meaning no sibling_next links449// are ever created to not alive klasses. This is an important invariant of the lock-free450// cleaning protocol, that allows us to safely unlink dead klasses from the sibling list.451if (Atomic::cmpxchg(&super->_subklass, prev_first_subklass, this) == prev_first_subklass) {452return;453}454}455debug_only(verify();)456}457458void Klass::clean_subklass() {459for (;;) {460// Need load_acquire, due to contending with concurrent inserts461Klass* subklass = Atomic::load_acquire(&_subklass);462if (subklass == NULL || subklass->is_loader_alive()) {463return;464}465// Try to fix _subklass until it points at something not dead.466Atomic::cmpxchg(&_subklass, subklass, subklass->next_sibling());467}468}469470void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) {471if (!ClassUnloading || !unloading_occurred) {472return;473}474475Klass* root = vmClasses::Object_klass();476Stack<Klass*, mtGC> stack;477478stack.push(root);479while (!stack.is_empty()) {480Klass* current = stack.pop();481482assert(current->is_loader_alive(), "just checking, this should be live");483484// Find and set the first alive subklass485Klass* sub = current->subklass(true);486current->clean_subklass();487if (sub != NULL) {488stack.push(sub);489}490491// Find and set the first alive sibling492Klass* sibling = current->next_sibling(true);493current->set_next_sibling(sibling);494if (sibling != NULL) {495stack.push(sibling);496}497498// Clean the implementors list and method data.499if (clean_alive_klasses && current->is_instance_klass()) {500InstanceKlass* ik = InstanceKlass::cast(current);501ik->clean_weak_instanceklass_links();502503// JVMTI RedefineClasses creates previous versions that are not in504// the class hierarchy, so process them here.505while ((ik = ik->previous_versions()) != NULL) {506ik->clean_weak_instanceklass_links();507}508}509}510}511512void Klass::metaspace_pointers_do(MetaspaceClosure* it) {513if (log_is_enabled(Trace, cds)) {514ResourceMark rm;515log_trace(cds)("Iter(Klass): %p (%s)", this, external_name());516}517518it->push(&_name);519it->push(&_secondary_super_cache);520it->push(&_secondary_supers);521for (int i = 0; i < _primary_super_limit; i++) {522it->push(&_primary_supers[i]);523}524it->push(&_super);525it->push((Klass**)&_subklass);526it->push((Klass**)&_next_sibling);527it->push(&_next_link);528529vtableEntry* vt = start_of_vtable();530for (int i=0; i<vtable_length(); i++) {531it->push(vt[i].method_addr());532}533}534535void Klass::remove_unshareable_info() {536assert (Arguments::is_dumping_archive(),537"only called during CDS dump time");538JFR_ONLY(REMOVE_ID(this);)539if (log_is_enabled(Trace, cds, unshareable)) {540ResourceMark rm;541log_trace(cds, unshareable)("remove: %s", external_name());542}543544set_subklass(NULL);545set_next_sibling(NULL);546set_next_link(NULL);547548// Null out class_loader_data because we don't share that yet.549set_class_loader_data(NULL);550set_is_shared();551}552553void Klass::remove_java_mirror() {554Arguments::assert_is_dumping_archive();555if (log_is_enabled(Trace, cds, unshareable)) {556ResourceMark rm;557log_trace(cds, unshareable)("remove java_mirror: %s", external_name());558}559// Just null out the mirror. The class_loader_data() no longer exists.560clear_java_mirror_handle();561}562563void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {564assert(is_klass(), "ensure C++ vtable is restored");565assert(is_shared(), "must be set");566JFR_ONLY(RESTORE_ID(this);)567if (log_is_enabled(Trace, cds, unshareable)) {568ResourceMark rm(THREAD);569log_trace(cds, unshareable)("restore: %s", external_name());570}571572// If an exception happened during CDS restore, some of these fields may already be573// set. We leave the class on the CLD list, even if incomplete so that we don't574// modify the CLD list outside a safepoint.575if (class_loader_data() == NULL) {576set_class_loader_data(loader_data);577578// Add to class loader list first before creating the mirror579// (same order as class file parsing)580loader_data->add_class(this);581}582583Handle loader(THREAD, loader_data->class_loader());584ModuleEntry* module_entry = NULL;585Klass* k = this;586if (k->is_objArray_klass()) {587k = ObjArrayKlass::cast(k)->bottom_klass();588}589// Obtain klass' module.590if (k->is_instance_klass()) {591InstanceKlass* ik = (InstanceKlass*) k;592module_entry = ik->module();593} else {594module_entry = ModuleEntryTable::javabase_moduleEntry();595}596// Obtain java.lang.Module, if available597Handle module_handle(THREAD, ((module_entry != NULL) ? module_entry->module() : (oop)NULL));598599if (this->has_archived_mirror_index()) {600ResourceMark rm(THREAD);601log_debug(cds, mirror)("%s has raw archived mirror", external_name());602if (HeapShared::open_archive_heap_region_mapped()) {603bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle,604protection_domain,605CHECK);606if (present) {607return;608}609}610611// No archived mirror data612log_debug(cds, mirror)("No archived mirror data for %s", external_name());613clear_java_mirror_handle();614this->clear_archived_mirror_index();615}616617// Only recreate it if not present. A previous attempt to restore may have618// gotten an OOM later but keep the mirror if it was created.619if (java_mirror() == NULL) {620ResourceMark rm(THREAD);621log_trace(cds, mirror)("Recreate mirror for %s", external_name());622java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, Handle(), CHECK);623}624}625626#if INCLUDE_CDS_JAVA_HEAP627oop Klass::archived_java_mirror() {628assert(has_archived_mirror_index(), "must have archived mirror");629return HeapShared::get_root(_archived_mirror_index);630}631632void Klass::clear_archived_mirror_index() {633if (_archived_mirror_index >= 0) {634HeapShared::clear_root(_archived_mirror_index);635}636_archived_mirror_index = -1;637}638639// No GC barrier640void Klass::set_archived_java_mirror(oop m) {641assert(DumpSharedSpaces, "called only during runtime");642_archived_mirror_index = HeapShared::append_root(m);643}644#endif // INCLUDE_CDS_JAVA_HEAP645646void Klass::check_array_allocation_length(int length, int max_length, TRAPS) {647if (length > max_length) {648if (!THREAD->in_retryable_allocation()) {649report_java_out_of_memory("Requested array size exceeds VM limit");650JvmtiExport::post_array_size_exhausted();651THROW_OOP(Universe::out_of_memory_error_array_size());652} else {653THROW_OOP(Universe::out_of_memory_error_retry());654}655} else if (length < 0) {656THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));657}658}659660// Replace the last '+' char with '/'.661static char* convert_hidden_name_to_java(Symbol* name) {662size_t name_len = name->utf8_length();663char* result = NEW_RESOURCE_ARRAY(char, name_len + 1);664name->as_klass_external_name(result, (int)name_len + 1);665for (int index = (int)name_len; index > 0; index--) {666if (result[index] == '+') {667result[index] = JVM_SIGNATURE_SLASH;668break;669}670}671return result;672}673674// In product mode, this function doesn't have virtual function calls so675// there might be some performance advantage to handling InstanceKlass here.676const char* Klass::external_name() const {677if (is_instance_klass()) {678const InstanceKlass* ik = static_cast<const InstanceKlass*>(this);679if (ik->is_hidden()) {680char* result = convert_hidden_name_to_java(name());681return result;682}683} else if (is_objArray_klass() && ObjArrayKlass::cast(this)->bottom_klass()->is_hidden()) {684char* result = convert_hidden_name_to_java(name());685return result;686}687if (name() == NULL) return "<unknown>";688return name()->as_klass_external_name();689}690691const char* Klass::signature_name() const {692if (name() == NULL) return "<unknown>";693if (is_objArray_klass() && ObjArrayKlass::cast(this)->bottom_klass()->is_hidden()) {694size_t name_len = name()->utf8_length();695char* result = NEW_RESOURCE_ARRAY(char, name_len + 1);696name()->as_C_string(result, (int)name_len + 1);697for (int index = (int)name_len; index > 0; index--) {698if (result[index] == '+') {699result[index] = JVM_SIGNATURE_DOT;700break;701}702}703return result;704}705return name()->as_C_string();706}707708const char* Klass::external_kind() const {709if (is_interface()) return "interface";710if (is_abstract()) return "abstract class";711return "class";712}713714int Klass::atomic_incr_biased_lock_revocation_count() {715return (int) Atomic::add(&_biased_lock_revocation_count, 1);716}717718// Unless overridden, jvmti_class_status has no flags set.719jint Klass::jvmti_class_status() const {720return 0;721}722723724// Printing725726void Klass::print_on(outputStream* st) const {727ResourceMark rm;728// print title729st->print("%s", internal_name());730print_address_on(st);731st->cr();732}733734#define BULLET " - "735736// Caller needs ResourceMark737void Klass::oop_print_on(oop obj, outputStream* st) {738// print title739st->print_cr("%s ", internal_name());740obj->print_address_on(st);741742if (WizardMode) {743// print header744obj->mark().print_on(st);745st->cr();746st->print(BULLET"prototype_header: " INTPTR_FORMAT, _prototype_header.value());747st->cr();748}749750// print class751st->print(BULLET"klass: ");752obj->klass()->print_value_on(st);753st->cr();754}755756void Klass::oop_print_value_on(oop obj, outputStream* st) {757// print title758ResourceMark rm; // Cannot print in debug mode without this759st->print("%s", internal_name());760obj->print_address_on(st);761}762763// Verification764765void Klass::verify_on(outputStream* st) {766767// This can be expensive, but it is worth checking that this klass is actually768// in the CLD graph but not in production.769assert(Metaspace::contains((address)this), "Should be");770771guarantee(this->is_klass(),"should be klass");772773if (super() != NULL) {774guarantee(super()->is_klass(), "should be klass");775}776if (secondary_super_cache() != NULL) {777Klass* ko = secondary_super_cache();778guarantee(ko->is_klass(), "should be klass");779}780for ( uint i = 0; i < primary_super_limit(); i++ ) {781Klass* ko = _primary_supers[i];782if (ko != NULL) {783guarantee(ko->is_klass(), "should be klass");784}785}786787if (java_mirror_no_keepalive() != NULL) {788guarantee(oopDesc::is_oop(java_mirror_no_keepalive()), "should be instance");789}790}791792void Klass::oop_verify_on(oop obj, outputStream* st) {793guarantee(oopDesc::is_oop(obj), "should be oop");794guarantee(obj->klass()->is_klass(), "klass field is not a klass");795}796797bool Klass::is_valid(Klass* k) {798if (!is_aligned(k, sizeof(MetaWord))) return false;799if ((size_t)k < os::min_page_size()) return false;800801if (!os::is_readable_range(k, k + 1)) return false;802if (!Metaspace::contains(k)) return false;803804if (!Symbol::is_valid(k->name())) return false;805return ClassLoaderDataGraph::is_valid(k->class_loader_data());806}807808Method* Klass::method_at_vtable(int index) {809#ifndef PRODUCT810assert(index >= 0, "valid vtable index");811if (DebugVtables) {812verify_vtable_index(index);813}814#endif815return start_of_vtable()[index].method();816}817818819#ifndef PRODUCT820821bool Klass::verify_vtable_index(int i) {822int limit = vtable_length()/vtableEntry::size();823assert(i >= 0 && i < limit, "index %d out of bounds %d", i, limit);824return true;825}826827#endif // PRODUCT828829// Caller needs ResourceMark830// joint_in_module_of_loader provides an optimization if 2 classes are in831// the same module to succinctly print out relevant information about their832// module name and class loader's name_and_id for error messages.833// Format:834// <fully-qualified-external-class-name1> and <fully-qualified-external-class-name2>835// are in module <module-name>[@<version>]836// of loader <loader-name_and_id>[, parent loader <parent-loader-name_and_id>]837const char* Klass::joint_in_module_of_loader(const Klass* class2, bool include_parent_loader) const {838assert(module() == class2->module(), "classes do not have the same module");839const char* class1_name = external_name();840size_t len = strlen(class1_name) + 1;841842const char* class2_description = class2->class_in_module_of_loader(true, include_parent_loader);843len += strlen(class2_description);844845len += strlen(" and ");846847char* joint_description = NEW_RESOURCE_ARRAY_RETURN_NULL(char, len);848849// Just return the FQN if error when allocating string850if (joint_description == NULL) {851return class1_name;852}853854jio_snprintf(joint_description, len, "%s and %s",855class1_name,856class2_description);857858return joint_description;859}860861// Caller needs ResourceMark862// class_in_module_of_loader provides a standard way to include863// relevant information about a class, such as its module name as864// well as its class loader's name_and_id, in error messages and logging.865// Format:866// <fully-qualified-external-class-name> is in module <module-name>[@<version>]867// of loader <loader-name_and_id>[, parent loader <parent-loader-name_and_id>]868const char* Klass::class_in_module_of_loader(bool use_are, bool include_parent_loader) const {869// 1. fully qualified external name of class870const char* klass_name = external_name();871size_t len = strlen(klass_name) + 1;872873// 2. module name + @version874const char* module_name = "";875const char* version = "";876bool has_version = false;877bool module_is_named = false;878const char* module_name_phrase = "";879const Klass* bottom_klass = is_objArray_klass() ?880ObjArrayKlass::cast(this)->bottom_klass() : this;881if (bottom_klass->is_instance_klass()) {882ModuleEntry* module = InstanceKlass::cast(bottom_klass)->module();883if (module->is_named()) {884module_is_named = true;885module_name_phrase = "module ";886module_name = module->name()->as_C_string();887len += strlen(module_name);888// Use version if exists and is not a jdk module889if (module->should_show_version()) {890has_version = true;891version = module->version()->as_C_string();892// Include stlen(version) + 1 for the "@"893len += strlen(version) + 1;894}895} else {896module_name = UNNAMED_MODULE;897len += UNNAMED_MODULE_LEN;898}899} else {900// klass is an array of primitives, module is java.base901module_is_named = true;902module_name_phrase = "module ";903module_name = JAVA_BASE_NAME;904len += JAVA_BASE_NAME_LEN;905}906907// 3. class loader's name_and_id908ClassLoaderData* cld = class_loader_data();909assert(cld != NULL, "class_loader_data should not be null");910const char* loader_name_and_id = cld->loader_name_and_id();911len += strlen(loader_name_and_id);912913// 4. include parent loader information914const char* parent_loader_phrase = "";915const char* parent_loader_name_and_id = "";916if (include_parent_loader &&917!cld->is_builtin_class_loader_data()) {918oop parent_loader = java_lang_ClassLoader::parent(class_loader());919ClassLoaderData *parent_cld = ClassLoaderData::class_loader_data_or_null(parent_loader);920// The parent loader's ClassLoaderData could be null if it is921// a delegating class loader that has never defined a class.922// In this case the loader's name must be obtained via the parent loader's oop.923if (parent_cld == NULL) {924oop cl_name_and_id = java_lang_ClassLoader::nameAndId(parent_loader);925if (cl_name_and_id != NULL) {926parent_loader_name_and_id = java_lang_String::as_utf8_string(cl_name_and_id);927}928} else {929parent_loader_name_and_id = parent_cld->loader_name_and_id();930}931parent_loader_phrase = ", parent loader ";932len += strlen(parent_loader_phrase) + strlen(parent_loader_name_and_id);933}934935// Start to construct final full class description string936len += ((use_are) ? strlen(" are in ") : strlen(" is in "));937len += strlen(module_name_phrase) + strlen(" of loader ");938939char* class_description = NEW_RESOURCE_ARRAY_RETURN_NULL(char, len);940941// Just return the FQN if error when allocating string942if (class_description == NULL) {943return klass_name;944}945946jio_snprintf(class_description, len, "%s %s in %s%s%s%s of loader %s%s%s",947klass_name,948(use_are) ? "are" : "is",949module_name_phrase,950module_name,951(has_version) ? "@" : "",952(has_version) ? version : "",953loader_name_and_id,954parent_loader_phrase,955parent_loader_name_and_id);956957return class_description;958}959960961