void ClassLoaderData::dump(outputStream * const out) { ResourceMark rm; out->print("ClassLoaderData CLD: "PTR_FORMAT", loader: "PTR_FORMAT", loader_klass: "PTR_FORMAT" %s {", p2i(this), p2i((void *)class_loader()), p2i(class_loader() != NULL ? class_loader()->klass() : NULL), loader_name()); if (claimed()) out->print(" claimed "); if (is_unloading()) out->print(" unloading "); out->print(" handles " INTPTR_FORMAT, p2i(handles())); out->cr(); if (metaspace_or_null() != NULL) { out->print_cr("metaspace: " INTPTR_FORMAT, p2i(metaspace_or_null())); metaspace_or_null()->dump(out); } else { out->print_cr("metaspace: NULL"); } #ifdef CLD_DUMP_KLASSES if (Verbose) { ResourceMark rm; Klass* k = _klasses; while (k != NULL) { out->print_cr("klass "PTR_FORMAT", %s, CT: %d, MUT: %d", k, k->name()->as_C_string(), k->has_modified_oops(), k->has_accumulated_modified_oops()); assert(k != k->next_link(), "no loops!"); k = k->next_link(); } } #endif // CLD_DUMP_KLASSES #undef CLD_DUMP_KLASSES if (_jmethod_ids != NULL) { Method::print_jmethod_ids(this, out); } out->print_cr("}"); }
void ClassLoaderData::print_value_on(outputStream* out) const { if (class_loader() == NULL) { out->print("NULL class_loader"); } else { out->print("class loader " INTPTR_FORMAT, p2i(this)); class_loader()->print_value_on(out); } }
bool ClassLoaderData::is_alive(BoolObjectClosure* is_alive_closure) const { bool alive = is_anonymous() ? is_alive_closure->do_object_b(_klasses->java_mirror()) : class_loader() == NULL || is_alive_closure->do_object_b(class_loader()); assert(!alive || claimed(), "must be claimed"); return alive; }
static ClassFileStream* prologue(ClassFileStream* stream, Symbol* name, ClassLoaderData* loader_data, Handle protection_domain, JvmtiCachedClassFileData** cached_class_file, TRAPS) { assert(stream != NULL, "invariant"); if (JvmtiExport::should_post_class_file_load_hook()) { assert(THREAD->is_Java_thread(), "must be a JavaThread"); const JavaThread* jt = (JavaThread*)THREAD; Handle class_loader(THREAD, loader_data->class_loader()); // Get the cached class file bytes (if any) from the class that // is being redefined or retransformed. We use jvmti_thread_state() // instead of JvmtiThreadState::state_for(jt) so we don't allocate // a JvmtiThreadState any earlier than necessary. This will help // avoid the bug described by 7126851. JvmtiThreadState* state = jt->jvmti_thread_state(); if (state != NULL) { KlassHandle* h_class_being_redefined = state->get_class_being_redefined(); if (h_class_being_redefined != NULL) { instanceKlassHandle ikh_class_being_redefined = instanceKlassHandle(THREAD, (*h_class_being_redefined)()); *cached_class_file = ikh_class_being_redefined->get_cached_class_file(); } } unsigned char* ptr = const_cast<unsigned char*>(stream->buffer()); unsigned char* end_ptr = ptr + stream->length(); JvmtiExport::post_class_file_load_hook(name, class_loader, protection_domain, &ptr, &end_ptr, cached_class_file); if (ptr != stream->buffer()) { // JVMTI agent has modified class file data. // Set new class file stream using JVMTI agent modified class file data. stream = new ClassFileStream(ptr, end_ptr - ptr, stream->source(), stream->need_verify()); } } return stream; }
Metaspace* ClassLoaderData::metaspace_non_null() { assert(!DumpSharedSpaces, "wrong metaspace!"); // If the metaspace has not been allocated, create a new one. Might want // to create smaller arena for Reflection class loaders also. // The reason for the delayed allocation is because some class loaders are // simply for delegating with no metadata of their own. if (_metaspace == NULL) { MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); // Check again if metaspace has been allocated while we were getting this lock. if (_metaspace != NULL) { return _metaspace; } if (this == the_null_class_loader_data()) { assert (class_loader() == NULL, "Must be"); set_metaspace(new Metaspace(_metaspace_lock, Metaspace::BootMetaspaceType)); } else if (is_anonymous()) { if (TraceClassLoaderData && Verbose && class_loader() != NULL) { tty->print_cr("is_anonymous: %s", class_loader()->klass()->internal_name()); } set_metaspace(new Metaspace(_metaspace_lock, Metaspace::AnonymousMetaspaceType)); } else if (class_loader()->is_a(SystemDictionary::reflect_DelegatingClassLoader_klass())) { if (TraceClassLoaderData && Verbose && class_loader() != NULL) { tty->print_cr("is_reflection: %s", class_loader()->klass()->internal_name()); } set_metaspace(new Metaspace(_metaspace_lock, Metaspace::ReflectionMetaspaceType)); } else { set_metaspace(new Metaspace(_metaspace_lock, Metaspace::StandardMetaspaceType)); } } return _metaspace; }
void ClassLoaderData::verify() { oop cl = class_loader(); guarantee(this == class_loader_data(cl) || is_anonymous(), "Must be the same"); guarantee(cl != NULL || this == ClassLoaderData::the_null_class_loader_data() || is_anonymous(), "must be"); // Verify the integrity of the allocated space. if (metaspace_or_null() != NULL) { metaspace_or_null()->verify(); } for (Klass* k = _klasses; k != NULL; k = k->next_link()) { guarantee(k->class_loader_data() == this, "Must be the same"); k->verify(); assert(k != k->next_link(), "no loops!"); } }
void ClassLoaderData::unload() { _unloading = true; // Tell serviceability tools these classes are unloading classes_do(InstanceKlass::notify_unload_class); if (TraceClassLoaderData) { ResourceMark rm; tty->print("[ClassLoaderData: unload loader data " INTPTR_FORMAT, p2i(this)); tty->print(" for instance " INTPTR_FORMAT " of %s", p2i((void *)class_loader()), loader_name()); if (is_anonymous()) { tty->print(" for anonymous class " INTPTR_FORMAT " ", p2i(_klasses)); } tty->print_cr("]"); } }
PlaceholderEntry* PlaceholderTable::get_entry(int index, unsigned int hash, symbolHandle class_name, Handle class_loader) { assert_locked_or_safepoint(SystemDictionary_lock); symbolOop class_name_ = class_name(); oop class_loader_ = class_loader(); for (PlaceholderEntry *place_probe = bucket(index); place_probe != NULL; place_probe = place_probe->next()) { if (place_probe->hash() == hash && place_probe->equals(class_name_, class_loader_)) { return place_probe; } } return NULL; }
const char* ClassLoaderData::loader_name() { // Handles null class loader return SystemDictionary::loader_name(class_loader()); }
/** * Returns true if this class loader data is for the extension class loader. */ bool ClassLoaderData::is_ext_class_loader_data() const { return SystemDictionary::is_ext_class_loader(class_loader()); }
oop ClassLoaderData::keep_alive_object() const { assert(!keep_alive(), "Don't use with CLDs that are artificially kept alive"); return is_anonymous() ? _klasses->java_mirror() : class_loader(); }