classLoaderData.hpp 11.9 KB
Newer Older
1
/*
2
 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
3 4 5 6 7 8 9 10
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

#ifndef SHARE_VM_CLASSFILE_CLASSLOADERDATA_HPP
#define SHARE_VM_CLASSFILE_CLASSLOADERDATA_HPP

#include "memory/allocation.hpp"
#include "memory/memRegion.hpp"
#include "memory/metaspace.hpp"
#include "memory/metaspaceCounters.hpp"
#include "runtime/mutex.hpp"
#include "utilities/growableArray.hpp"
34
#include "utilities/macros.hpp"
S
sla 已提交
35
#if INCLUDE_TRACE
36
#include "utilities/ticks.hpp"
S
sla 已提交
37 38
#endif

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
//
// A class loader represents a linkset. Conceptually, a linkset identifies
// the complete transitive closure of resolved links that a dynamic linker can
// produce.
//
// A ClassLoaderData also encapsulates the allocation space, called a metaspace,
// used by the dynamic linker to allocate the runtime representation of all
// the types it defines.
//
// ClassLoaderData are stored in the runtime representation of classes and the
// system dictionary, are roots of garbage collection, and provides iterators
// for root tracing and other GC operations.

class ClassLoaderData;
class JNIMethodBlock;
class JNIHandleBlock;
class Metadebug;
S
sla 已提交
56

57 58 59 60 61
// GC root for walking class loader data created

class ClassLoaderDataGraph : public AllStatic {
  friend class ClassLoaderData;
  friend class ClassLoaderDataGraphMetaspaceIterator;
62
  friend class ClassLoaderDataGraphKlassIteratorAtomic;
63 64 65 66 67 68 69
  friend class VMStructs;
 private:
  // All CLDs (except the null CLD) can be reached by walking _head->_next->...
  static ClassLoaderData* _head;
  static ClassLoaderData* _unloading;
  // CMS support.
  static ClassLoaderData* _saved_head;
70
  static ClassLoaderData* _saved_unloading;
71
  static bool _should_purge;
72

73
  static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS);
S
sla 已提交
74
  static void post_class_unload_events(void);
75
  static void clean_metaspaces();
76
 public:
77
  static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
78 79
  static void purge();
  static void clear_claimed_marks();
80
  // oops do
81
  static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
82
  static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
83 84 85 86 87 88 89
  static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
  // cld do
  static void cld_do(CLDClosure* cl);
  static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
  static void keep_alive_cld_do(CLDClosure* cl);
  static void always_strong_cld_do(CLDClosure* cl);
  // klass do
90
  static void classes_do(KlassClosure* klass_closure);
S
sla 已提交
91
  static void classes_do(void f(Klass* const));
92
  static void loaded_classes_do(KlassClosure* klass_closure);
S
sla 已提交
93
  static void classes_unloading_do(void f(Klass* const));
94
  static bool do_unloading(BoolObjectClosure* is_alive, bool clean_alive);
95 96 97 98 99

  // CMS support.
  static void remember_new_clds(bool remember) { _saved_head = (remember ? _head : NULL); }
  static GrowableArray<ClassLoaderData*>* new_clds();

100 101 102 103 104 105 106 107 108 109
  static void set_should_purge(bool b) { _should_purge = b; }
  static void purge_if_needed() {
    // Only purge the CLDG for CMS if concurrent sweep is complete.
    if (_should_purge) {
      purge();
      // reset for next time.
      set_should_purge(false);
    }
  }

110 111
  static void free_deallocate_lists();

112 113 114 115
  static void dump_on(outputStream * const out) PRODUCT_RETURN;
  static void dump() { dump_on(tty); }
  static void verify();

116
  static bool unload_list_contains(const void* x);
117
#ifndef PRODUCT
118 119
  static bool contains_loader_data(ClassLoaderData* loader_data);
#endif
S
sla 已提交
120 121 122

#if INCLUDE_TRACE
 private:
123
  static Ticks _class_unload_time;
S
sla 已提交
124 125
  static void class_unload_event(Klass* const k);
#endif
126 127 128 129 130 131 132
};

// ClassLoaderData class

class ClassLoaderData : public CHeapObj<mtClass> {
  friend class VMStructs;
 private:
133 134 135 136 137 138 139
  class Dependencies VALUE_OBJ_CLASS_SPEC {
    objArrayOop _list_head;
    void locked_add(objArrayHandle last,
                    objArrayHandle new_dependency,
                    Thread* THREAD);
   public:
    Dependencies() : _list_head(NULL) {}
140 141 142
    Dependencies(TRAPS) : _list_head(NULL) {
      init(CHECK);
    }
143 144 145 146 147
    void add(Handle dependency, TRAPS);
    void init(TRAPS);
    void oops_do(OopClosure* f);
  };

148
  friend class ClassLoaderDataGraph;
149
  friend class ClassLoaderDataGraphKlassIteratorAtomic;
150 151 152 153 154 155
  friend class ClassLoaderDataGraphMetaspaceIterator;
  friend class MetaDataFactory;
  friend class Method;

  static ClassLoaderData * _the_null_class_loader_data;

156 157 158 159 160
  oop _class_loader;          // oop used to uniquely identify a class loader
                              // class loader or a canonical class path
  Dependencies _dependencies; // holds dependencies from this class loader
                              // data to others.

161 162 163 164
  Metaspace * _metaspace;  // Meta-space where meta-data defined by the
                           // classes in the class loader are allocated.
  Mutex* _metaspace_lock;  // Locks the metaspace for allocations and setup.
  bool _unloading;         // true if this class loader goes away
165
  bool _keep_alive;        // if this CLD is kept alive without a keep_alive_object().
166
  bool _is_anonymous;      // if this CLD is for an anonymous class
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
  volatile int _claimed;   // true if claimed, for example during GC traces.
                           // To avoid applying oop closure more than once.
                           // Has to be an int because we cas it.
  Klass* _klasses;         // The classes defined by the class loader.

  JNIHandleBlock* _handles; // Handles to constant pool arrays

  // These method IDs are created for the class loader and set to NULL when the
  // class loader is unloaded.  They are rarely freed, only for redefine classes
  // and if they lose a data race in InstanceKlass.
  JNIMethodBlock*                  _jmethod_ids;

  // Metadata to be deallocated when it's safe at class unloading, when
  // this class loader isn't unloaded itself.
  GrowableArray<Metadata*>*      _deallocate_list;

  // Support for walking class loader data objects
  ClassLoaderData* _next; /// Next loader_datas created

  // ReadOnly and ReadWrite metaspaces (static because only on the null
  // class loader for now).
  static Metaspace* _ro_metaspace;
  static Metaspace* _rw_metaspace;

  void set_next(ClassLoaderData* next) { _next = next; }
  ClassLoaderData* next() const        { return _next; }

194
  ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies);
195 196 197 198 199 200 201 202 203 204 205 206 207 208
  ~ClassLoaderData();

  void set_metaspace(Metaspace* m) { _metaspace = m; }

  JNIHandleBlock* handles() const;
  void set_handles(JNIHandleBlock* handles);

  Mutex* metaspace_lock() const { return _metaspace_lock; }

  // GC interface.
  void clear_claimed()          { _claimed = 0; }
  bool claimed() const          { return _claimed == 1; }
  bool claim();

209 210
  void unload();
  bool keep_alive() const       { return _keep_alive; }
S
sla 已提交
211
  void classes_do(void f(Klass*));
212
  void loaded_classes_do(KlassClosure* klass_closure);
213 214 215 216 217 218 219 220 221
  void classes_do(void f(InstanceKlass*));

  // Deallocate free list during class unloading.
  void free_deallocate_list();

  // Allocate out of this class loader data
  MetaWord* allocate(size_t size);

 public:
222 223 224

  bool is_alive(BoolObjectClosure* is_alive_closure) const;

225 226 227 228 229 230 231
  // Accessors
  Metaspace* metaspace_or_null() const     { return _metaspace; }

  static ClassLoaderData* the_null_class_loader_data() {
    return _the_null_class_loader_data;
  }

232
  bool is_anonymous() const { return _is_anonymous; }
233

234 235 236
  static void init_null_class_loader_data() {
    assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
    assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
237 238 239

    // We explicitly initialize the Dependencies object at a later phase in the initialization
    _the_null_class_loader_data = new ClassLoaderData((oop)NULL, false, Dependencies());
240 241 242 243 244 245 246 247 248 249
    ClassLoaderDataGraph::_head = _the_null_class_loader_data;
    assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");
    if (DumpSharedSpaces) {
      _the_null_class_loader_data->initialize_shared_metaspaces();
    }
  }

  bool is_the_null_class_loader_data() const {
    return this == _the_null_class_loader_data;
  }
250
  bool is_ext_class_loader_data() const;
251 252 253 254 255 256 257

  // The Metaspace is created lazily so may be NULL.  This
  // method will allocate a Metaspace if needed.
  Metaspace* metaspace_non_null();

  oop class_loader() const      { return _class_loader; }

258 259 260
  // The object the GC is using to keep this ClassLoaderData alive.
  oop keep_alive_object() const;

261 262 263 264 265
  // Returns true if this class loader data is for a loader going away.
  bool is_unloading() const     {
    assert(!(is_the_null_class_loader_data() && _unloading), "The null class loader can never be unloaded");
    return _unloading;
  }
266 267

  // Used to make sure that this CLD is not unloaded.
268
  void set_keep_alive(bool value) { _keep_alive = value; }
269 270 271 272 273 274 275 276 277 278 279 280 281 282

  unsigned int identity_hash() {
    return _class_loader == NULL ? 0 : _class_loader->identity_hash();
  }

  // Used when tracing from klasses.
  void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);

  void classes_do(KlassClosure* klass_closure);

  JNIMethodBlock* jmethod_ids() const              { return _jmethod_ids; }
  void set_jmethod_ids(JNIMethodBlock* new_block)  { _jmethod_ids = new_block; }

  void print_value() { print_value_on(tty); }
283
  void print_value_on(outputStream* out) const;
284 285
  void dump(outputStream * const out) PRODUCT_RETURN;
  void verify();
286
  const char* loader_name();
287 288 289 290

  jobject add_handle(Handle h);
  void add_class(Klass* k);
  void remove_class(Klass* k);
291
  bool contains_klass(Klass* k);
292
  void record_dependency(Klass* to, TRAPS);
293
  void init_dependencies(TRAPS);
294 295 296 297

  void add_to_deallocate_list(Metadata* m);

  static ClassLoaderData* class_loader_data(oop loader);
298
  static ClassLoaderData* class_loader_data_or_null(oop loader);
299
  static ClassLoaderData* anonymous_class_loader_data(oop loader, TRAPS);
300 301 302 303 304 305 306 307
  static void print_loader(ClassLoaderData *loader_data, outputStream *out);

  // CDS support
  Metaspace* ro_metaspace();
  Metaspace* rw_metaspace();
  void initialize_shared_metaspaces();
};

308 309
// An iterator that distributes Klasses to parallel worker threads.
class ClassLoaderDataGraphKlassIteratorAtomic : public StackObj {
310
 Klass* volatile _next_klass;
311 312 313 314 315 316 317
 public:
  ClassLoaderDataGraphKlassIteratorAtomic();
  Klass* next_klass();
 private:
  static Klass* next_klass_in_cldg(Klass* klass);
};

318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
class ClassLoaderDataGraphMetaspaceIterator : public StackObj {
  ClassLoaderData* _data;
 public:
  ClassLoaderDataGraphMetaspaceIterator();
  ~ClassLoaderDataGraphMetaspaceIterator();
  bool repeat() { return _data != NULL; }
  Metaspace* get_next() {
    assert(_data != NULL, "Should not be NULL in call to the iterator");
    Metaspace* result = _data->metaspace_or_null();
    _data = _data->next();
    // This result might be NULL for class loaders without metaspace
    // yet.  It would be nice to return only non-null results but
    // there is no guarantee that there will be a non-null result
    // down the list so the caller is going to have to check.
    return result;
  }
};
#endif // SHARE_VM_CLASSFILE_CLASSLOADERDATA_HPP