src/share/vm/classfile/classLoaderData.cpp

Thu, 29 Nov 2012 16:50:29 -0500

author
coleenp
date
Thu, 29 Nov 2012 16:50:29 -0500
changeset 4304
90273fc0a981
parent 4037
da91efe96a93
child 4345
30866cd626b0
child 4353
1b1e16471e46
permissions
-rw-r--r--

8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
Summary: Add ClassLoaderData object for each anonymous class with metaspaces to allocate in.
Reviewed-by: twisti, jrose, stefank

     1 /*
     2  * Copyright (c) 2012, 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  */
    25 // A ClassLoaderData identifies the full set of class types that a class
    26 // loader's name resolution strategy produces for a given configuration of the
    27 // class loader.
    28 // Class types in the ClassLoaderData may be defined by from class file binaries
    29 // provided by the class loader, or from other class loader it interacts with
    30 // according to its name resolution strategy.
    31 //
    32 // Class loaders that implement a deterministic name resolution strategy
    33 // (including with respect to their delegation behavior), such as the boot, the
    34 // extension, and the system loaders of the JDK's built-in class loader
    35 // hierarchy, always produce the same linkset for a given configuration.
    36 //
    37 // ClassLoaderData carries information related to a linkset (e.g.,
    38 // metaspace holding its klass definitions).
    39 // The System Dictionary and related data structures (e.g., placeholder table,
    40 // loader constraints table) as well as the runtime representation of classes
    41 // only reference ClassLoaderData.
    42 //
    43 // Instances of java.lang.ClassLoader holds a pointer to a ClassLoaderData that
    44 // that represent the loader's "linking domain" in the JVM.
    45 //
    46 // The bootstrap loader (represented by NULL) also has a ClassLoaderData,
    47 // the singleton class the_null_class_loader_data().
    49 #include "precompiled.hpp"
    50 #include "classfile/classLoaderData.hpp"
    51 #include "classfile/classLoaderData.inline.hpp"
    52 #include "classfile/javaClasses.hpp"
    53 #include "classfile/systemDictionary.hpp"
    54 #include "code/codeCache.hpp"
    55 #include "memory/metadataFactory.hpp"
    56 #include "memory/metaspaceShared.hpp"
    57 #include "prims/jvmtiRedefineClasses.hpp"
    58 #include "runtime/jniHandles.hpp"
    59 #include "runtime/mutex.hpp"
    60 #include "runtime/safepoint.hpp"
    61 #include "runtime/synchronizer.hpp"
    62 #include "utilities/growableArray.hpp"
    63 #include "utilities/ostream.hpp"
    65 ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
    67 ClassLoaderData::ClassLoaderData(Handle h_class_loader) : _class_loader(h_class_loader()),
    68   _metaspace(NULL), _unloading(false), _keep_alive(false), _klasses(NULL),
    69   _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
    70   _next(NULL), _dependencies(NULL),
    71   _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {
    72     // empty
    73 }
    75 void ClassLoaderData::init_dependencies(TRAPS) {
    76   // Create empty dependencies array to add to. CMS requires this to be
    77   // an oop so that it can track additions via card marks.  We think.
    78   _dependencies = (oop)oopFactory::new_objectArray(2, CHECK);
    79 }
    81 bool ClassLoaderData::claim() {
    82   if (_claimed == 1) {
    83     return false;
    84   }
    86   return (int) Atomic::cmpxchg(1, &_claimed, 0) == 0;
    87 }
    89 void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
    90   if (must_claim && !claim()) {
    91     return;
    92   }
    94   f->do_oop(&_class_loader);
    95   f->do_oop(&_dependencies);
    96   _handles->oops_do(f);
    97   if (klass_closure != NULL) {
    98     classes_do(klass_closure);
    99   }
   100 }
   102 void ClassLoaderData::classes_do(KlassClosure* klass_closure) {
   103   for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
   104     klass_closure->do_klass(k);
   105   }
   106 }
   108 void ClassLoaderData::classes_do(void f(InstanceKlass*)) {
   109   for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
   110     if (k->oop_is_instance()) {
   111       f(InstanceKlass::cast(k));
   112     }
   113   }
   114 }
   116 void ClassLoaderData::record_dependency(Klass* k, TRAPS) {
   117   ClassLoaderData * const from_cld = this;
   118   ClassLoaderData * const to_cld = k->class_loader_data();
   120   // Dependency to the null class loader data doesn't need to be recorded
   121   // because the null class loader data never goes away.
   122   if (to_cld->is_the_null_class_loader_data()) {
   123     return;
   124   }
   126   oop to;
   127   if (to_cld->is_anonymous()) {
   128     // Anonymous class dependencies are through the mirror.
   129     to = k->java_mirror();
   130   } else {
   131     to = to_cld->class_loader();
   133     // If from_cld is anonymous, even if it's class_loader is a parent of 'to'
   134     // we still have to add it.  The class_loader won't keep from_cld alive.
   135     if (!from_cld->is_anonymous()) {
   136       // Check that this dependency isn't from the same or parent class_loader
   137       oop from = from_cld->class_loader();
   139       oop curr = from;
   140       while (curr != NULL) {
   141         if (curr == to) {
   142           return; // this class loader is in the parent list, no need to add it.
   143         }
   144         curr = java_lang_ClassLoader::parent(curr);
   145       }
   146     }
   147   }
   149   // It's a dependency we won't find through GC, add it. This is relatively rare
   150   // Must handle over GC point.
   151   Handle dependency(THREAD, to);
   152   from_cld->add_dependency(dependency, CHECK);
   153 }
   156 void ClassLoaderData::add_dependency(Handle dependency, TRAPS) {
   157   // Check first if this dependency is already in the list.
   158   // Save a pointer to the last to add to under the lock.
   159   objArrayOop ok = (objArrayOop)_dependencies;
   160   objArrayOop last = NULL;
   161   while (ok != NULL) {
   162     last = ok;
   163     if (ok->obj_at(0) == dependency()) {
   164       // Don't need to add it
   165       return;
   166     }
   167     ok = (objArrayOop)ok->obj_at(1);
   168   }
   170   // Create a new dependency node with fields for (class_loader or mirror, next)
   171   objArrayOop deps = oopFactory::new_objectArray(2, CHECK);
   172   deps->obj_at_put(0, dependency());
   174   // Must handle over more GC points
   175   objArrayHandle new_dependency(THREAD, deps);
   177   // Add the dependency under lock
   178   assert (last != NULL, "dependencies should be initialized");
   179   objArrayHandle last_handle(THREAD, last);
   180   locked_add_dependency(last_handle, new_dependency);
   181 }
   183 void ClassLoaderData::locked_add_dependency(objArrayHandle last_handle,
   184                                             objArrayHandle new_dependency) {
   186   // Have to lock and put the new dependency on the end of the dependency
   187   // array so the card mark for CMS sees that this dependency is new.
   188   // Can probably do this lock free with some effort.
   189   MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   191   oop loader_or_mirror = new_dependency->obj_at(0);
   193   // Since the dependencies are only added, add to the end.
   194   objArrayOop end = last_handle();
   195   objArrayOop last = NULL;
   196   while (end != NULL) {
   197     last = end;
   198     // check again if another thread added it to the end.
   199     if (end->obj_at(0) == loader_or_mirror) {
   200       // Don't need to add it
   201       return;
   202     }
   203     end = (objArrayOop)end->obj_at(1);
   204   }
   205   assert (last != NULL, "dependencies should be initialized");
   206   // fill in the first element with the oop in new_dependency.
   207   if (last->obj_at(0) == NULL) {
   208     last->obj_at_put(0, new_dependency->obj_at(0));
   209   } else {
   210     last->obj_at_put(1, new_dependency());
   211   }
   212 }
   214 void ClassLoaderDataGraph::clear_claimed_marks() {
   215   for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
   216     cld->clear_claimed();
   217   }
   218 }
   220 void ClassLoaderData::add_class(Klass* k) {
   221   MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   222   Klass* old_value = _klasses;
   223   k->set_next_link(old_value);
   224   // link the new item into the list
   225   _klasses = k;
   227   if (TraceClassLoaderData && Verbose && k->class_loader_data() != NULL) {
   228     ResourceMark rm;
   229     tty->print_cr("[TraceClassLoaderData] Adding k: " PTR_FORMAT " %s to CLD: "
   230                   PTR_FORMAT " loader: " PTR_FORMAT " %s",
   231                   k,
   232                   k->external_name(),
   233                   k->class_loader_data(),
   234                   k->class_loader(),
   235                   loader_name());
   236   }
   237 }
   239 // This is called by InstanceKlass::deallocate_contents() to remove the
   240 // scratch_class for redefine classes.  We need a lock because there it may not
   241 // be called at a safepoint if there's an error.
   242 void ClassLoaderData::remove_class(Klass* scratch_class) {
   243   MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   244   Klass* prev = NULL;
   245   for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
   246     if (k == scratch_class) {
   247       if (prev == NULL) {
   248         _klasses = k->next_link();
   249       } else {
   250         Klass* next = k->next_link();
   251         prev->set_next_link(next);
   252       }
   253       return;
   254     }
   255     prev = k;
   256   }
   257   ShouldNotReachHere();   // should have found this class!!
   258 }
   261 bool ClassLoaderData::is_anonymous() const {
   262   Klass* k = _klasses;
   263   return (_keep_alive || (k != NULL && k->oop_is_instance() &&
   264           InstanceKlass::cast(k)->is_anonymous()));
   265 }
   267 void ClassLoaderData::unload() {
   268   _unloading = true;
   270   if (TraceClassLoaderData) {
   271     ResourceMark rm;
   272     tty->print("[ClassLoaderData: unload loader data "PTR_FORMAT, this);
   273     tty->print(" for instance "PTR_FORMAT" of %s", class_loader(),
   274                loader_name());
   275     if (is_anonymous()) {
   276       tty->print(" for anonymous class  "PTR_FORMAT " ", _klasses);
   277     }
   278     tty->print_cr("]");
   279   }
   280 }
   282 bool ClassLoaderData::is_alive(BoolObjectClosure* is_alive_closure) const {
   283   bool alive =
   284     is_anonymous() ?
   285        is_alive_closure->do_object_b(_klasses->java_mirror()) :
   286        class_loader() == NULL || is_alive_closure->do_object_b(class_loader());
   287   assert(!alive || claimed(), "must be claimed");
   288   return alive;
   289 }
   292 ClassLoaderData::~ClassLoaderData() {
   293   Metaspace *m = _metaspace;
   294   if (m != NULL) {
   295     _metaspace = NULL;
   296     // release the metaspace
   297     delete m;
   298     // release the handles
   299     if (_handles != NULL) {
   300       JNIHandleBlock::release_block(_handles);
   301       _handles = NULL;
   302     }
   303   }
   305   // Clear all the JNI handles for methods
   306   // These aren't deallocated and are going to look like a leak, but that's
   307   // needed because we can't really get rid of jmethodIDs because we don't
   308   // know when native code is going to stop using them.  The spec says that
   309   // they're "invalid" but existing programs likely rely on their being
   310   // NULL after class unloading.
   311   if (_jmethod_ids != NULL) {
   312     Method::clear_jmethod_ids(this);
   313   }
   314   // Delete lock
   315   delete _metaspace_lock;
   317   // Delete free list
   318   if (_deallocate_list != NULL) {
   319     delete _deallocate_list;
   320   }
   321 }
   323 Metaspace* ClassLoaderData::metaspace_non_null() {
   324   // If the metaspace has not been allocated, create a new one.  Might want
   325   // to create smaller arena for Reflection class loaders also.
   326   // The reason for the delayed allocation is because some class loaders are
   327   // simply for delegating with no metadata of their own.
   328   if (_metaspace == NULL) {
   329     MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   330     // Check again if metaspace has been allocated while we were getting this lock.
   331     if (_metaspace != NULL) {
   332       return _metaspace;
   333     }
   334     if (this == the_null_class_loader_data()) {
   335       assert (class_loader() == NULL, "Must be");
   336       size_t word_size = Metaspace::first_chunk_word_size();
   337       set_metaspace(new Metaspace(_metaspace_lock, word_size));
   338     } else {
   339       set_metaspace(new Metaspace(_metaspace_lock));  // default size for now.
   340     }
   341   }
   342   return _metaspace;
   343 }
   345 JNIHandleBlock* ClassLoaderData::handles() const           { return _handles; }
   346 void ClassLoaderData::set_handles(JNIHandleBlock* handles) { _handles = handles; }
   348 jobject ClassLoaderData::add_handle(Handle h) {
   349   MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   350   if (handles() == NULL) {
   351     set_handles(JNIHandleBlock::allocate_block());
   352   }
   353   return handles()->allocate_handle(h());
   354 }
   356 // Add this metadata pointer to be freed when it's safe.  This is only during
   357 // class unloading because Handles might point to this metadata field.
   358 void ClassLoaderData::add_to_deallocate_list(Metadata* m) {
   359   // Metadata in shared region isn't deleted.
   360   if (!m->is_shared()) {
   361     MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   362     if (_deallocate_list == NULL) {
   363       _deallocate_list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(100, true);
   364     }
   365     _deallocate_list->append_if_missing(m);
   366   }
   367 }
   369 // Deallocate free metadata on the free list.  How useful the PermGen was!
   370 void ClassLoaderData::free_deallocate_list() {
   371   // Don't need lock, at safepoint
   372   assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
   373   if (_deallocate_list == NULL) {
   374     return;
   375   }
   376   // Go backwards because this removes entries that are freed.
   377   for (int i = _deallocate_list->length() - 1; i >= 0; i--) {
   378     Metadata* m = _deallocate_list->at(i);
   379     if (!m->on_stack()) {
   380       _deallocate_list->remove_at(i);
   381       // There are only three types of metadata that we deallocate directly.
   382       // Cast them so they can be used by the template function.
   383       if (m->is_method()) {
   384         MetadataFactory::free_metadata(this, (Method*)m);
   385       } else if (m->is_constantPool()) {
   386         MetadataFactory::free_metadata(this, (ConstantPool*)m);
   387       } else if (m->is_klass()) {
   388         MetadataFactory::free_metadata(this, (InstanceKlass*)m);
   389       } else {
   390         ShouldNotReachHere();
   391       }
   392     }
   393   }
   394 }
   396 // These anonymous class loaders are to contain classes used for JSR292
   397 ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) {
   398   // Add a new class loader data to the graph.
   399   ClassLoaderData* cld = ClassLoaderDataGraph::add(NULL, loader, CHECK_NULL);
   400   return cld;
   401 }
   403 const char* ClassLoaderData::loader_name() {
   404   // Handles null class loader
   405   return SystemDictionary::loader_name(class_loader());
   406 }
   408 #ifndef PRODUCT
   409 // Define to dump klasses
   410 #undef CLD_DUMP_KLASSES
   412 void ClassLoaderData::dump(outputStream * const out) {
   413   ResourceMark rm;
   414   out->print("ClassLoaderData CLD: "PTR_FORMAT", loader: "PTR_FORMAT", loader_klass: "PTR_FORMAT" %s {",
   415       this, class_loader(),
   416       class_loader() != NULL ? class_loader()->klass() : NULL, loader_name());
   417   if (claimed()) out->print(" claimed ");
   418   if (is_unloading()) out->print(" unloading ");
   419   out->print(" handles " INTPTR_FORMAT, handles());
   420   out->cr();
   421   if (metaspace_or_null() != NULL) {
   422     out->print_cr("metaspace: " PTR_FORMAT, metaspace_or_null());
   423     metaspace_or_null()->dump(out);
   424   } else {
   425     out->print_cr("metaspace: NULL");
   426   }
   428 #ifdef CLD_DUMP_KLASSES
   429   if (Verbose) {
   430     ResourceMark rm;
   431     Klass* k = _klasses;
   432     while (k != NULL) {
   433       out->print_cr("klass "PTR_FORMAT", %s, CT: %d, MUT: %d", k, k->name()->as_C_string(),
   434           k->has_modified_oops(), k->has_accumulated_modified_oops());
   435       k = k->next_link();
   436     }
   437   }
   438 #endif  // CLD_DUMP_KLASSES
   439 #undef CLD_DUMP_KLASSES
   440   if (_jmethod_ids != NULL) {
   441     Method::print_jmethod_ids(this, out);
   442   }
   443   out->print_cr("}");
   444 }
   445 #endif // PRODUCT
   447 void ClassLoaderData::verify() {
   448   oop cl = class_loader();
   450   guarantee(this == class_loader_data(cl) || is_anonymous(), "Must be the same");
   451   guarantee(cl != NULL || this == ClassLoaderData::the_null_class_loader_data() || is_anonymous(), "must be");
   453   // Verify the integrity of the allocated space.
   454   if (metaspace_or_null() != NULL) {
   455     metaspace_or_null()->verify();
   456   }
   458   for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
   459     guarantee(k->class_loader_data() == this, "Must be the same");
   460     k->verify();
   461   }
   462 }
   465 // GC root of class loader data created.
   466 ClassLoaderData* ClassLoaderDataGraph::_head = NULL;
   467 ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL;
   468 ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL;
   471 // Add a new class loader data node to the list.  Assign the newly created
   472 // ClassLoaderData into the java/lang/ClassLoader object as a hidden field
   473 ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle loader, TRAPS) {
   474   // Not assigned a class loader data yet.
   475   // Create one.
   476   ClassLoaderData* *list_head = &_head;
   477   ClassLoaderData* next = _head;
   478   ClassLoaderData* cld = new ClassLoaderData(loader);
   480   if (cld_addr != NULL) {
   481     // First, Atomically set it
   482     ClassLoaderData* old = (ClassLoaderData*) Atomic::cmpxchg_ptr(cld, cld_addr, NULL);
   483     if (old != NULL) {
   484       delete cld;
   485       // Returns the data.
   486       return old;
   487     }
   488   } else {
   489     // Disallow unloading for this CLD during initialization if there is no
   490     // class_loader oop to link this to.
   491     cld->set_keep_alive(true);
   492   }
   494   // We won the race, and therefore the task of adding the data to the list of
   495   // class loader data
   496   do {
   497     cld->set_next(next);
   498     ClassLoaderData* exchanged = (ClassLoaderData*)Atomic::cmpxchg_ptr(cld, list_head, next);
   499     if (exchanged == next) {
   500       if (TraceClassLoaderData) {
   501         ResourceMark rm;
   502         tty->print("[ClassLoaderData: ");
   503         tty->print("create class loader data "PTR_FORMAT, cld);
   504         tty->print(" for instance "PTR_FORMAT" of %s", cld->class_loader(),
   505                    cld->loader_name());
   506         tty->print_cr("]");
   507       }
   508       // Create dependencies after the CLD is added to the list.  Otherwise,
   509       // the GC GC will not find the CLD and the _class_loader field will
   510       // not be updated.
   511       cld->init_dependencies(CHECK_NULL);
   512       return cld;
   513     }
   514     next = exchanged;
   515   } while (true);
   517 }
   519 void ClassLoaderDataGraph::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
   520   for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
   521     cld->oops_do(f, klass_closure, must_claim);
   522   }
   523 }
   525 void ClassLoaderDataGraph::keep_alive_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
   526   for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
   527     if (cld->keep_alive()) {
   528       cld->oops_do(f, klass_closure, must_claim);
   529     }
   530   }
   531 }
   533 void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
   534   if (ClassUnloading) {
   535     ClassLoaderData::the_null_class_loader_data()->oops_do(f, klass_closure, must_claim);
   536     // keep any special CLDs alive.
   537     ClassLoaderDataGraph::keep_alive_oops_do(f, klass_closure, must_claim);
   538   } else {
   539     ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim);
   540   }
   541 }
   543 void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
   544   for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
   545     cld->classes_do(klass_closure);
   546   }
   547 }
   549 GrowableArray<ClassLoaderData*>* ClassLoaderDataGraph::new_clds() {
   550   assert(_head == NULL || _saved_head != NULL, "remember_new_clds(true) not called?");
   552   GrowableArray<ClassLoaderData*>* array = new GrowableArray<ClassLoaderData*>();
   554   // The CLDs in [_head, _saved_head] were all added during last call to remember_new_clds(true);
   555   ClassLoaderData* curr = _head;
   556   while (curr != _saved_head) {
   557     if (!curr->claimed()) {
   558       array->push(curr);
   560       if (TraceClassLoaderData) {
   561         tty->print("[ClassLoaderData] found new CLD: ");
   562         curr->print_value_on(tty);
   563         tty->cr();
   564       }
   565     }
   567     curr = curr->_next;
   568   }
   570   return array;
   571 }
   573 #ifndef PRODUCT
   574 // for debugging and hsfind(x)
   575 bool ClassLoaderDataGraph::contains(address x) {
   576   // I think we need the _metaspace_lock taken here because the class loader
   577   // data graph could be changing while we are walking it (new entries added,
   578   // new entries being unloaded, etc).
   579   if (DumpSharedSpaces) {
   580     // There are only two metaspaces to worry about.
   581     ClassLoaderData* ncld = ClassLoaderData::the_null_class_loader_data();
   582     return (ncld->ro_metaspace()->contains(x) || ncld->rw_metaspace()->contains(x));
   583   }
   585   if (UseSharedSpaces && MetaspaceShared::is_in_shared_space(x)) {
   586     return true;
   587   }
   589   for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
   590     if (cld->metaspace_or_null() != NULL && cld->metaspace_or_null()->contains(x)) {
   591       return true;
   592     }
   593   }
   595   // Could also be on an unloading list which is okay, ie. still allocated
   596   // for a little while.
   597   for (ClassLoaderData* ucld = _unloading; ucld != NULL; ucld = ucld->next()) {
   598     if (ucld->metaspace_or_null() != NULL && ucld->metaspace_or_null()->contains(x)) {
   599       return true;
   600     }
   601   }
   602   return false;
   603 }
   605 bool ClassLoaderDataGraph::contains_loader_data(ClassLoaderData* loader_data) {
   606   for (ClassLoaderData* data = _head; data != NULL; data = data->next()) {
   607     if (loader_data == data) {
   608       return true;
   609     }
   610   }
   612   return false;
   613 }
   614 #endif // PRODUCT
   617 // Move class loader data from main list to the unloaded list for unloading
   618 // and deallocation later.
   619 bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) {
   620   ClassLoaderData* data = _head;
   621   ClassLoaderData* prev = NULL;
   622   bool seen_dead_loader = false;
   623   // mark metadata seen on the stack and code cache so we can delete
   624   // unneeded entries.
   625   bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
   626   MetadataOnStackMark md_on_stack;
   627   while (data != NULL) {
   628     if (data->keep_alive() || data->is_alive(is_alive_closure)) {
   629       if (has_redefined_a_class) {
   630         data->classes_do(InstanceKlass::purge_previous_versions);
   631       }
   632       data->free_deallocate_list();
   633       prev = data;
   634       data = data->next();
   635       continue;
   636     }
   637     seen_dead_loader = true;
   638     ClassLoaderData* dead = data;
   639     dead->unload();
   640     data = data->next();
   641     // Remove from loader list.
   642     if (prev != NULL) {
   643       prev->set_next(data);
   644     } else {
   645       assert(dead == _head, "sanity check");
   646       _head = data;
   647     }
   648     dead->set_next(_unloading);
   649     _unloading = dead;
   650   }
   651   return seen_dead_loader;
   652 }
   654 void ClassLoaderDataGraph::purge() {
   655   ClassLoaderData* list = _unloading;
   656   _unloading = NULL;
   657   ClassLoaderData* next = list;
   658   while (next != NULL) {
   659     ClassLoaderData* purge_me = next;
   660     next = purge_me->next();
   661     delete purge_me;
   662   }
   663 }
   665 // CDS support
   667 // Global metaspaces for writing information to the shared archive.  When
   668 // application CDS is supported, we may need one per metaspace, so this
   669 // sort of looks like it.
   670 Metaspace* ClassLoaderData::_ro_metaspace = NULL;
   671 Metaspace* ClassLoaderData::_rw_metaspace = NULL;
   672 static bool _shared_metaspaces_initialized = false;
   674 // Initialize shared metaspaces (change to call from somewhere not lazily)
   675 void ClassLoaderData::initialize_shared_metaspaces() {
   676   assert(DumpSharedSpaces, "only use this for dumping shared spaces");
   677   assert(this == ClassLoaderData::the_null_class_loader_data(),
   678          "only supported for null loader data for now");
   679   assert (!_shared_metaspaces_initialized, "only initialize once");
   680   MutexLockerEx ml(metaspace_lock(),  Mutex::_no_safepoint_check_flag);
   681   _ro_metaspace = new Metaspace(_metaspace_lock, SharedReadOnlySize/wordSize);
   682   _rw_metaspace = new Metaspace(_metaspace_lock, SharedReadWriteSize/wordSize);
   683   _shared_metaspaces_initialized = true;
   684 }
   686 Metaspace* ClassLoaderData::ro_metaspace() {
   687   assert(_ro_metaspace != NULL, "should already be initialized");
   688   return _ro_metaspace;
   689 }
   691 Metaspace* ClassLoaderData::rw_metaspace() {
   692   assert(_rw_metaspace != NULL, "should already be initialized");
   693   return _rw_metaspace;
   694 }
   697 ClassLoaderDataGraphMetaspaceIterator::ClassLoaderDataGraphMetaspaceIterator() {
   698   _data = ClassLoaderDataGraph::_head;
   699 }
   701 ClassLoaderDataGraphMetaspaceIterator::~ClassLoaderDataGraphMetaspaceIterator() {}
   703 #ifndef PRODUCT
   704 // callable from debugger
   705 extern "C" int print_loader_data_graph() {
   706   ClassLoaderDataGraph::dump_on(tty);
   707   return 0;
   708 }
   710 void ClassLoaderDataGraph::verify() {
   711   for (ClassLoaderData* data = _head; data != NULL; data = data->next()) {
   712     data->verify();
   713   }
   714 }
   716 void ClassLoaderDataGraph::dump_on(outputStream * const out) {
   717   for (ClassLoaderData* data = _head; data != NULL; data = data->next()) {
   718     data->dump(out);
   719   }
   720   MetaspaceAux::dump(out);
   721 }
   723 void ClassLoaderData::print_value_on(outputStream* out) const {
   724   if (class_loader() == NULL) {
   725     out->print_cr("NULL class_loader");
   726   } else {
   727     out->print("class loader "PTR_FORMAT, this);
   728     class_loader()->print_value_on(out);
   729   }
   730 }
   731 #endif // PRODUCT

mercurial