ClassLoaderData::~ClassLoaderData() { // Release C heap structures for all the classes. classes_do(InstanceKlass::release_C_heap_structures); Metaspace *m = _metaspace; if (m != NULL) { _metaspace = NULL; // release the metaspace delete m; // release the handles if (_handles != NULL) { JNIHandleBlock::release_block(_handles); _handles = NULL; } } // Clear all the JNI handles for methods // These aren't deallocated and are going to look like a leak, but that's // needed because we can't really get rid of jmethodIDs because we don't // know when native code is going to stop using them. The spec says that // they're "invalid" but existing programs likely rely on their being // NULL after class unloading. if (_jmethod_ids != NULL) { Method::clear_jmethod_ids(this); } // Delete lock delete _metaspace_lock; // Delete free list if (_deallocate_list != NULL) { delete _deallocate_list; } }
void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) { if (must_claim && !claim()) { return; } f->do_oop(&_class_loader); _dependencies.oops_do(f); _handles->oops_do(f); if (klass_closure != NULL) { classes_do(klass_closure); } }
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("]"); } }