hotspot/src/share/vm/classfile/classLoaderData.hpp
changeset 25491 70fb742e40aa
parent 25490 59f226da8d81
child 25492 d27050bdfb04
equal deleted inserted replaced
25490:59f226da8d81 25491:70fb742e40aa
    29 #include "memory/memRegion.hpp"
    29 #include "memory/memRegion.hpp"
    30 #include "memory/metaspace.hpp"
    30 #include "memory/metaspace.hpp"
    31 #include "memory/metaspaceCounters.hpp"
    31 #include "memory/metaspaceCounters.hpp"
    32 #include "runtime/mutex.hpp"
    32 #include "runtime/mutex.hpp"
    33 #include "utilities/growableArray.hpp"
    33 #include "utilities/growableArray.hpp"
       
    34 
    34 #if INCLUDE_TRACE
    35 #if INCLUDE_TRACE
    35 # include "utilities/ticks.hpp"
    36 # include "utilities/ticks.hpp"
    36 #endif
    37 #endif
    37 
    38 
    38 //
    39 //
    56 // GC root for walking class loader data created
    57 // GC root for walking class loader data created
    57 
    58 
    58 class ClassLoaderDataGraph : public AllStatic {
    59 class ClassLoaderDataGraph : public AllStatic {
    59   friend class ClassLoaderData;
    60   friend class ClassLoaderData;
    60   friend class ClassLoaderDataGraphMetaspaceIterator;
    61   friend class ClassLoaderDataGraphMetaspaceIterator;
    61   friend class ClassLoaderDataGraphKlassIteratorAtomic;
       
    62   friend class VMStructs;
    62   friend class VMStructs;
    63  private:
    63  private:
    64   // All CLDs (except the null CLD) can be reached by walking _head->_next->...
    64   // All CLDs (except the null CLD) can be reached by walking _head->_next->...
    65   static ClassLoaderData* _head;
    65   static ClassLoaderData* _head;
    66   static ClassLoaderData* _unloading;
    66   static ClassLoaderData* _unloading;
    72   static void post_class_unload_events(void);
    72   static void post_class_unload_events(void);
    73  public:
    73  public:
    74   static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
    74   static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
    75   static void purge();
    75   static void purge();
    76   static void clear_claimed_marks();
    76   static void clear_claimed_marks();
    77   // oops do
       
    78   static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
    77   static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
       
    78   static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
    79   static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
    79   static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
    80   static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
       
    81   // cld do
       
    82   static void cld_do(CLDClosure* cl);
    80   static void cld_do(CLDClosure* cl);
    83   static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
       
    84   static void keep_alive_cld_do(CLDClosure* cl);
       
    85   static void always_strong_cld_do(CLDClosure* cl);
       
    86   // klass do
       
    87   static void classes_do(KlassClosure* klass_closure);
    81   static void classes_do(KlassClosure* klass_closure);
    88   static void classes_do(void f(Klass* const));
    82   static void classes_do(void f(Klass* const));
    89   static void methods_do(void f(Method*));
    83   static void methods_do(void f(Method*));
    90   static void loaded_classes_do(KlassClosure* klass_closure);
    84   static void loaded_classes_do(KlassClosure* klass_closure);
    91   static void classes_unloading_do(void f(Klass* const));
    85   static void classes_unloading_do(void f(Klass* const));
   107 
   101 
   108   static void dump_on(outputStream * const out) PRODUCT_RETURN;
   102   static void dump_on(outputStream * const out) PRODUCT_RETURN;
   109   static void dump() { dump_on(tty); }
   103   static void dump() { dump_on(tty); }
   110   static void verify();
   104   static void verify();
   111 
   105 
   112   static bool unload_list_contains(const void* x);
       
   113 #ifndef PRODUCT
   106 #ifndef PRODUCT
   114   static bool contains_loader_data(ClassLoaderData* loader_data);
   107   static bool contains_loader_data(ClassLoaderData* loader_data);
   115 #endif
   108 #endif
   116 
   109 
   117 #if INCLUDE_TRACE
   110 #if INCLUDE_TRACE
   140     void init(TRAPS);
   133     void init(TRAPS);
   141     void oops_do(OopClosure* f);
   134     void oops_do(OopClosure* f);
   142   };
   135   };
   143 
   136 
   144   friend class ClassLoaderDataGraph;
   137   friend class ClassLoaderDataGraph;
   145   friend class ClassLoaderDataGraphKlassIteratorAtomic;
       
   146   friend class ClassLoaderDataGraphMetaspaceIterator;
   138   friend class ClassLoaderDataGraphMetaspaceIterator;
   147   friend class MetaDataFactory;
   139   friend class MetaDataFactory;
   148   friend class Method;
   140   friend class Method;
   149 
   141 
   150   static ClassLoaderData * _the_null_class_loader_data;
   142   static ClassLoaderData * _the_null_class_loader_data;
   200   bool claimed() const          { return _claimed == 1; }
   192   bool claimed() const          { return _claimed == 1; }
   201   bool claim();
   193   bool claim();
   202 
   194 
   203   void unload();
   195   void unload();
   204   bool keep_alive() const       { return _keep_alive; }
   196   bool keep_alive() const       { return _keep_alive; }
       
   197   bool is_alive(BoolObjectClosure* is_alive_closure) const;
   205   void classes_do(void f(Klass*));
   198   void classes_do(void f(Klass*));
   206   void loaded_classes_do(KlassClosure* klass_closure);
   199   void loaded_classes_do(KlassClosure* klass_closure);
   207   void classes_do(void f(InstanceKlass*));
   200   void classes_do(void f(InstanceKlass*));
   208   void methods_do(void f(Method*));
   201   void methods_do(void f(Method*));
   209 
   202 
   212 
   205 
   213   // Allocate out of this class loader data
   206   // Allocate out of this class loader data
   214   MetaWord* allocate(size_t size);
   207   MetaWord* allocate(size_t size);
   215 
   208 
   216  public:
   209  public:
   217 
       
   218   bool is_alive(BoolObjectClosure* is_alive_closure) const;
       
   219 
       
   220   // Accessors
   210   // Accessors
   221   Metaspace* metaspace_or_null() const     { return _metaspace; }
   211   Metaspace* metaspace_or_null() const     { return _metaspace; }
   222 
   212 
   223   static ClassLoaderData* the_null_class_loader_data() {
   213   static ClassLoaderData* the_null_class_loader_data() {
   224     return _the_null_class_loader_data;
   214     return _the_null_class_loader_data;
   298 
   288 
   299   // CDS support
   289   // CDS support
   300   Metaspace* ro_metaspace();
   290   Metaspace* ro_metaspace();
   301   Metaspace* rw_metaspace();
   291   Metaspace* rw_metaspace();
   302   void initialize_shared_metaspaces();
   292   void initialize_shared_metaspaces();
   303 };
       
   304 
       
   305 // An iterator that distributes Klasses to parallel worker threads.
       
   306 class ClassLoaderDataGraphKlassIteratorAtomic : public StackObj {
       
   307   volatile Klass* _next_klass;
       
   308  public:
       
   309   ClassLoaderDataGraphKlassIteratorAtomic();
       
   310   Klass* next_klass();
       
   311  private:
       
   312   static Klass* next_klass_in_cldg(Klass* klass);
       
   313 };
   293 };
   314 
   294 
   315 class ClassLoaderDataGraphMetaspaceIterator : public StackObj {
   295 class ClassLoaderDataGraphMetaspaceIterator : public StackObj {
   316   ClassLoaderData* _data;
   296   ClassLoaderData* _data;
   317  public:
   297  public: