dictionary.cpp revision 6402:2377269bd73d
1/*
2 * Copyright (c) 2003, 2014, 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 */
24
25#include "precompiled.hpp"
26#include "classfile/dictionary.hpp"
27#include "classfile/systemDictionary.hpp"
28#include "memory/iterator.hpp"
29#include "oops/oop.inline.hpp"
30#include "prims/jvmtiRedefineClassesTrace.hpp"
31#include "runtime/orderAccess.inline.hpp"
32#include "utilities/hashtable.inline.hpp"
33
34
35DictionaryEntry*  Dictionary::_current_class_entry = NULL;
36int               Dictionary::_current_class_index =    0;
37
38
39Dictionary::Dictionary(int table_size)
40  : TwoOopHashtable<Klass*, mtClass>(table_size, sizeof(DictionaryEntry)) {
41  _current_class_index = 0;
42  _current_class_entry = NULL;
43  _pd_cache_table = new ProtectionDomainCacheTable(defaultProtectionDomainCacheSize);
44};
45
46
47Dictionary::Dictionary(int table_size, HashtableBucket<mtClass>* t,
48                       int number_of_entries)
49  : TwoOopHashtable<Klass*, mtClass>(table_size, sizeof(DictionaryEntry), t, number_of_entries) {
50  _current_class_index = 0;
51  _current_class_entry = NULL;
52  _pd_cache_table = new ProtectionDomainCacheTable(defaultProtectionDomainCacheSize);
53};
54
55ProtectionDomainCacheEntry* Dictionary::cache_get(oop protection_domain) {
56  return _pd_cache_table->get(protection_domain);
57}
58
59DictionaryEntry* Dictionary::new_entry(unsigned int hash, Klass* klass,
60                                       ClassLoaderData* loader_data) {
61  DictionaryEntry* entry = (DictionaryEntry*)Hashtable<Klass*, mtClass>::new_entry(hash, klass);
62  entry->set_loader_data(loader_data);
63  entry->set_pd_set(NULL);
64  assert(klass->oop_is_instance(), "Must be");
65  return entry;
66}
67
68
69void Dictionary::free_entry(DictionaryEntry* entry) {
70  // avoid recursion when deleting linked list
71  while (entry->pd_set() != NULL) {
72    ProtectionDomainEntry* to_delete = entry->pd_set();
73    entry->set_pd_set(to_delete->next());
74    delete to_delete;
75  }
76  Hashtable<Klass*, mtClass>::free_entry(entry);
77}
78
79
80bool DictionaryEntry::contains_protection_domain(oop protection_domain) const {
81#ifdef ASSERT
82  if (protection_domain == InstanceKlass::cast(klass())->protection_domain()) {
83    // Ensure this doesn't show up in the pd_set (invariant)
84    bool in_pd_set = false;
85    for (ProtectionDomainEntry* current = _pd_set;
86                                current != NULL;
87                                current = current->next()) {
88      if (current->protection_domain() == protection_domain) {
89        in_pd_set = true;
90        break;
91      }
92    }
93    if (in_pd_set) {
94      assert(false, "A klass's protection domain should not show up "
95                    "in its sys. dict. PD set");
96    }
97  }
98#endif /* ASSERT */
99
100  if (protection_domain == InstanceKlass::cast(klass())->protection_domain()) {
101    // Succeeds trivially
102    return true;
103  }
104
105  for (ProtectionDomainEntry* current = _pd_set;
106                              current != NULL;
107                              current = current->next()) {
108    if (current->protection_domain() == protection_domain) return true;
109  }
110  return false;
111}
112
113
114void DictionaryEntry::add_protection_domain(Dictionary* dict, oop protection_domain) {
115  assert_locked_or_safepoint(SystemDictionary_lock);
116  if (!contains_protection_domain(protection_domain)) {
117    ProtectionDomainCacheEntry* entry = dict->cache_get(protection_domain);
118    ProtectionDomainEntry* new_head =
119                new ProtectionDomainEntry(entry, _pd_set);
120    // Warning: Preserve store ordering.  The SystemDictionary is read
121    //          without locks.  The new ProtectionDomainEntry must be
122    //          complete before other threads can be allowed to see it
123    //          via a store to _pd_set.
124    OrderAccess::release_store_ptr(&_pd_set, new_head);
125  }
126  if (TraceProtectionDomainVerification && WizardMode) {
127    print();
128  }
129}
130
131
132bool Dictionary::do_unloading() {
133  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
134  bool class_was_unloaded = false;
135  int  index = 0; // Defined here for portability! Do not move
136
137  // Remove unloadable entries and classes from system dictionary
138  // The placeholder array has been handled in always_strong_oops_do.
139  DictionaryEntry* probe = NULL;
140  for (index = 0; index < table_size(); index++) {
141    for (DictionaryEntry** p = bucket_addr(index); *p != NULL; ) {
142      probe = *p;
143      Klass* e = probe->klass();
144      ClassLoaderData* loader_data = probe->loader_data();
145
146      InstanceKlass* ik = InstanceKlass::cast(e);
147
148      // Non-unloadable classes were handled in always_strong_oops_do
149      if (!is_strongly_reachable(loader_data, e)) {
150        // Entry was not visited in phase1 (negated test from phase1)
151        assert(!loader_data->is_the_null_class_loader_data(), "unloading entry with null class loader");
152        ClassLoaderData* k_def_class_loader_data = ik->class_loader_data();
153
154        // Do we need to delete this system dictionary entry?
155        bool purge_entry = false;
156
157        // Do we need to delete this system dictionary entry?
158        if (loader_data->is_unloading()) {
159          // If the loader is not live this entry should always be
160          // removed (will never be looked up again). Note that this is
161          // not the same as unloading the referred class.
162          if (k_def_class_loader_data == loader_data) {
163            // This is the defining entry, so the referred class is about
164            // to be unloaded.
165            class_was_unloaded = true;
166          }
167          // Also remove this system dictionary entry.
168          purge_entry = true;
169
170        } else {
171          // The loader in this entry is alive. If the klass is dead,
172          // (determined by checking the defining class loader)
173          // the loader must be an initiating loader (rather than the
174          // defining loader). Remove this entry.
175          if (k_def_class_loader_data->is_unloading()) {
176            // If we get here, the class_loader_data must not be the defining
177            // loader, it must be an initiating one.
178            assert(k_def_class_loader_data != loader_data,
179                   "cannot have live defining loader and unreachable klass");
180            // Loader is live, but class and its defining loader are dead.
181            // Remove the entry. The class is going away.
182            purge_entry = true;
183          }
184        }
185
186        if (purge_entry) {
187          *p = probe->next();
188          if (probe == _current_class_entry) {
189            _current_class_entry = NULL;
190          }
191          free_entry(probe);
192          continue;
193        }
194      }
195      p = probe->next_addr();
196    }
197  }
198  return class_was_unloaded;
199}
200
201
202void Dictionary::always_strong_oops_do(OopClosure* blk) {
203  // Follow all system classes and temporary placeholders in dictionary; only
204  // protection domain oops contain references into the heap. In a first
205  // pass over the system dictionary determine which need to be treated as
206  // strongly reachable and mark them as such.
207  for (int index = 0; index < table_size(); index++) {
208    for (DictionaryEntry *probe = bucket(index);
209                          probe != NULL;
210                          probe = probe->next()) {
211      Klass* e = probe->klass();
212      ClassLoaderData* loader_data = probe->loader_data();
213      if (is_strongly_reachable(loader_data, e)) {
214        probe->set_strongly_reachable();
215      }
216    }
217  }
218  // Then iterate over the protection domain cache to apply the closure on the
219  // previously marked ones.
220  _pd_cache_table->always_strong_oops_do(blk);
221}
222
223
224void Dictionary::always_strong_classes_do(KlassClosure* closure) {
225  // Follow all system classes and temporary placeholders in dictionary
226  for (int index = 0; index < table_size(); index++) {
227    for (DictionaryEntry* probe = bucket(index);
228                          probe != NULL;
229                          probe = probe->next()) {
230      Klass* e = probe->klass();
231      ClassLoaderData* loader_data = probe->loader_data();
232      if (is_strongly_reachable(loader_data, e)) {
233        closure->do_klass(e);
234      }
235    }
236  }
237}
238
239
240//   Just the classes from defining class loaders
241void Dictionary::classes_do(void f(Klass*)) {
242  for (int index = 0; index < table_size(); index++) {
243    for (DictionaryEntry* probe = bucket(index);
244                          probe != NULL;
245                          probe = probe->next()) {
246      Klass* k = probe->klass();
247      if (probe->loader_data() == InstanceKlass::cast(k)->class_loader_data()) {
248        f(k);
249      }
250    }
251  }
252}
253
254// Added for initialize_itable_for_klass to handle exceptions
255//   Just the classes from defining class loaders
256void Dictionary::classes_do(void f(Klass*, TRAPS), TRAPS) {
257  for (int index = 0; index < table_size(); index++) {
258    for (DictionaryEntry* probe = bucket(index);
259                          probe != NULL;
260                          probe = probe->next()) {
261      Klass* k = probe->klass();
262      if (probe->loader_data() == InstanceKlass::cast(k)->class_loader_data()) {
263        f(k, CHECK);
264      }
265    }
266  }
267}
268
269//   All classes, and their class loaders
270// Don't iterate over placeholders
271void Dictionary::classes_do(void f(Klass*, ClassLoaderData*)) {
272  for (int index = 0; index < table_size(); index++) {
273    for (DictionaryEntry* probe = bucket(index);
274                          probe != NULL;
275                          probe = probe->next()) {
276      Klass* k = probe->klass();
277      f(k, probe->loader_data());
278    }
279  }
280}
281
282void Dictionary::oops_do(OopClosure* f) {
283  // Only the protection domain oops contain references into the heap. Iterate
284  // over all of them.
285  _pd_cache_table->oops_do(f);
286}
287
288void Dictionary::methods_do(void f(Method*)) {
289  for (int index = 0; index < table_size(); index++) {
290    for (DictionaryEntry* probe = bucket(index);
291                          probe != NULL;
292                          probe = probe->next()) {
293      Klass* k = probe->klass();
294      if (probe->loader_data() == InstanceKlass::cast(k)->class_loader_data()) {
295        // only take klass is we have the entry with the defining class loader
296        InstanceKlass::cast(k)->methods_do(f);
297      }
298    }
299  }
300}
301
302void Dictionary::unlink(BoolObjectClosure* is_alive) {
303  // Only the protection domain cache table may contain references to the heap
304  // that need to be unlinked.
305  _pd_cache_table->unlink(is_alive);
306}
307
308Klass* Dictionary::try_get_next_class() {
309  while (true) {
310    if (_current_class_entry != NULL) {
311      Klass* k = _current_class_entry->klass();
312      _current_class_entry = _current_class_entry->next();
313      return k;
314    }
315    _current_class_index = (_current_class_index + 1) % table_size();
316    _current_class_entry = bucket(_current_class_index);
317  }
318  // never reached
319}
320
321// Add a loaded class to the system dictionary.
322// Readers of the SystemDictionary aren't always locked, so _buckets
323// is volatile. The store of the next field in the constructor is
324// also cast to volatile;  we do this to ensure store order is maintained
325// by the compilers.
326
327void Dictionary::add_klass(Symbol* class_name, ClassLoaderData* loader_data,
328                           KlassHandle obj) {
329  assert_locked_or_safepoint(SystemDictionary_lock);
330  assert(obj() != NULL, "adding NULL obj");
331  assert(obj()->name() == class_name, "sanity check on name");
332  assert(loader_data != NULL, "Must be non-NULL");
333
334  unsigned int hash = compute_hash(class_name, loader_data);
335  int index = hash_to_index(hash);
336  DictionaryEntry* entry = new_entry(hash, obj(), loader_data);
337  add_entry(index, entry);
338}
339
340
341// This routine does not lock the system dictionary.
342//
343// Since readers don't hold a lock, we must make sure that system
344// dictionary entries are only removed at a safepoint (when only one
345// thread is running), and are added to in a safe way (all links must
346// be updated in an MT-safe manner).
347//
348// Callers should be aware that an entry could be added just after
349// _buckets[index] is read here, so the caller will not see the new entry.
350DictionaryEntry* Dictionary::get_entry(int index, unsigned int hash,
351                                       Symbol* class_name,
352                                       ClassLoaderData* loader_data) {
353  debug_only(_lookup_count++);
354  for (DictionaryEntry* entry = bucket(index);
355                        entry != NULL;
356                        entry = entry->next()) {
357    if (entry->hash() == hash && entry->equals(class_name, loader_data)) {
358      return entry;
359    }
360    debug_only(_lookup_length++);
361  }
362  return NULL;
363}
364
365
366Klass* Dictionary::find(int index, unsigned int hash, Symbol* name,
367                          ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
368  DictionaryEntry* entry = get_entry(index, hash, name, loader_data);
369  if (entry != NULL && entry->is_valid_protection_domain(protection_domain)) {
370    return entry->klass();
371  } else {
372    return NULL;
373  }
374}
375
376
377Klass* Dictionary::find_class(int index, unsigned int hash,
378                                Symbol* name, ClassLoaderData* loader_data) {
379  assert_locked_or_safepoint(SystemDictionary_lock);
380  assert (index == index_for(name, loader_data), "incorrect index?");
381
382  DictionaryEntry* entry = get_entry(index, hash, name, loader_data);
383  return (entry != NULL) ? entry->klass() : (Klass*)NULL;
384}
385
386
387// Variant of find_class for shared classes.  No locking required, as
388// that table is static.
389
390Klass* Dictionary::find_shared_class(int index, unsigned int hash,
391                                       Symbol* name) {
392  assert (index == index_for(name, NULL), "incorrect index?");
393
394  DictionaryEntry* entry = get_entry(index, hash, name, NULL);
395  return (entry != NULL) ? entry->klass() : (Klass*)NULL;
396}
397
398
399void Dictionary::add_protection_domain(int index, unsigned int hash,
400                                       instanceKlassHandle klass,
401                                       ClassLoaderData* loader_data, Handle protection_domain,
402                                       TRAPS) {
403  Symbol*  klass_name = klass->name();
404  DictionaryEntry* entry = get_entry(index, hash, klass_name, loader_data);
405
406  assert(entry != NULL,"entry must be present, we just created it");
407  assert(protection_domain() != NULL,
408         "real protection domain should be present");
409
410  entry->add_protection_domain(this, protection_domain());
411
412  assert(entry->contains_protection_domain(protection_domain()),
413         "now protection domain should be present");
414}
415
416
417bool Dictionary::is_valid_protection_domain(int index, unsigned int hash,
418                                            Symbol* name,
419                                            ClassLoaderData* loader_data,
420                                            Handle protection_domain) {
421  DictionaryEntry* entry = get_entry(index, hash, name, loader_data);
422  return entry->is_valid_protection_domain(protection_domain);
423}
424
425
426void Dictionary::reorder_dictionary() {
427
428  // Copy all the dictionary entries into a single master list.
429
430  DictionaryEntry* master_list = NULL;
431  for (int i = 0; i < table_size(); ++i) {
432    DictionaryEntry* p = bucket(i);
433    while (p != NULL) {
434      DictionaryEntry* tmp;
435      tmp = p->next();
436      p->set_next(master_list);
437      master_list = p;
438      p = tmp;
439    }
440    set_entry(i, NULL);
441  }
442
443  // Add the dictionary entries back to the list in the correct buckets.
444  while (master_list != NULL) {
445    DictionaryEntry* p = master_list;
446    master_list = master_list->next();
447    p->set_next(NULL);
448    Symbol* class_name = InstanceKlass::cast((Klass*)(p->klass()))->name();
449    // Since the null class loader data isn't copied to the CDS archive,
450    // compute the hash with NULL for loader data.
451    unsigned int hash = compute_hash(class_name, NULL);
452    int index = hash_to_index(hash);
453    p->set_hash(hash);
454    p->set_loader_data(NULL);   // loader_data isn't copied to CDS
455    p->set_next(bucket(index));
456    set_entry(index, p);
457  }
458}
459
460ProtectionDomainCacheTable::ProtectionDomainCacheTable(int table_size)
461  : Hashtable<oop, mtClass>(table_size, sizeof(ProtectionDomainCacheEntry))
462{
463}
464
465void ProtectionDomainCacheTable::unlink(BoolObjectClosure* is_alive) {
466  assert(SafepointSynchronize::is_at_safepoint(), "must be");
467  for (int i = 0; i < table_size(); ++i) {
468    ProtectionDomainCacheEntry** p = bucket_addr(i);
469    ProtectionDomainCacheEntry* entry = bucket(i);
470    while (entry != NULL) {
471      if (is_alive->do_object_b(entry->literal())) {
472        p = entry->next_addr();
473      } else {
474        *p = entry->next();
475        free_entry(entry);
476      }
477      entry = *p;
478    }
479  }
480}
481
482void ProtectionDomainCacheTable::oops_do(OopClosure* f) {
483  for (int index = 0; index < table_size(); index++) {
484    for (ProtectionDomainCacheEntry* probe = bucket(index);
485                                     probe != NULL;
486                                     probe = probe->next()) {
487      probe->oops_do(f);
488    }
489  }
490}
491
492uint ProtectionDomainCacheTable::bucket_size() {
493  return sizeof(ProtectionDomainCacheEntry);
494}
495
496#ifndef PRODUCT
497void ProtectionDomainCacheTable::print() {
498  tty->print_cr("Protection domain cache table (table_size=%d, classes=%d)",
499                table_size(), number_of_entries());
500  for (int index = 0; index < table_size(); index++) {
501    for (ProtectionDomainCacheEntry* probe = bucket(index);
502                                     probe != NULL;
503                                     probe = probe->next()) {
504      probe->print();
505    }
506  }
507}
508
509void ProtectionDomainCacheEntry::print() {
510  tty->print_cr("entry "PTR_FORMAT" value "PTR_FORMAT" strongly_reachable %d next "PTR_FORMAT,
511                this, (void*)literal(), _strongly_reachable, next());
512}
513#endif
514
515void ProtectionDomainCacheTable::verify() {
516  int element_count = 0;
517  for (int index = 0; index < table_size(); index++) {
518    for (ProtectionDomainCacheEntry* probe = bucket(index);
519                                     probe != NULL;
520                                     probe = probe->next()) {
521      probe->verify();
522      element_count++;
523    }
524  }
525  guarantee(number_of_entries() == element_count,
526            "Verify of protection domain cache table failed");
527  debug_only(verify_lookup_length((double)number_of_entries() / table_size()));
528}
529
530void ProtectionDomainCacheEntry::verify() {
531  guarantee(literal()->is_oop(), "must be an oop");
532}
533
534void ProtectionDomainCacheTable::always_strong_oops_do(OopClosure* f) {
535  // the caller marked the protection domain cache entries that we need to apply
536  // the closure on. Only process them.
537  for (int index = 0; index < table_size(); index++) {
538    for (ProtectionDomainCacheEntry* probe = bucket(index);
539                                     probe != NULL;
540                                     probe = probe->next()) {
541      if (probe->is_strongly_reachable()) {
542        probe->reset_strongly_reachable();
543        probe->oops_do(f);
544      }
545    }
546  }
547}
548
549ProtectionDomainCacheEntry* ProtectionDomainCacheTable::get(oop protection_domain) {
550  unsigned int hash = compute_hash(protection_domain);
551  int index = hash_to_index(hash);
552
553  ProtectionDomainCacheEntry* entry = find_entry(index, protection_domain);
554  if (entry == NULL) {
555    entry = add_entry(index, hash, protection_domain);
556  }
557  return entry;
558}
559
560ProtectionDomainCacheEntry* ProtectionDomainCacheTable::find_entry(int index, oop protection_domain) {
561  for (ProtectionDomainCacheEntry* e = bucket(index); e != NULL; e = e->next()) {
562    if (e->protection_domain() == protection_domain) {
563      return e;
564    }
565  }
566
567  return NULL;
568}
569
570ProtectionDomainCacheEntry* ProtectionDomainCacheTable::add_entry(int index, unsigned int hash, oop protection_domain) {
571  assert_locked_or_safepoint(SystemDictionary_lock);
572  assert(index == index_for(protection_domain), "incorrect index?");
573  assert(find_entry(index, protection_domain) == NULL, "no double entry");
574
575  ProtectionDomainCacheEntry* p = new_entry(hash, protection_domain);
576  Hashtable<oop, mtClass>::add_entry(index, p);
577  return p;
578}
579
580void ProtectionDomainCacheTable::free(ProtectionDomainCacheEntry* to_delete) {
581  unsigned int hash = compute_hash(to_delete->protection_domain());
582  int index = hash_to_index(hash);
583
584  ProtectionDomainCacheEntry** p = bucket_addr(index);
585  ProtectionDomainCacheEntry* entry = bucket(index);
586  while (true) {
587    assert(entry != NULL, "sanity");
588
589    if (entry == to_delete) {
590      *p = entry->next();
591      Hashtable<oop, mtClass>::free_entry(entry);
592      break;
593    } else {
594      p = entry->next_addr();
595      entry = *p;
596    }
597  }
598}
599
600SymbolPropertyTable::SymbolPropertyTable(int table_size)
601  : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry))
602{
603}
604SymbolPropertyTable::SymbolPropertyTable(int table_size, HashtableBucket<mtSymbol>* t,
605                                         int number_of_entries)
606  : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry), t, number_of_entries)
607{
608}
609
610
611SymbolPropertyEntry* SymbolPropertyTable::find_entry(int index, unsigned int hash,
612                                                     Symbol* sym,
613                                                     intptr_t sym_mode) {
614  assert(index == index_for(sym, sym_mode), "incorrect index?");
615  for (SymbolPropertyEntry* p = bucket(index); p != NULL; p = p->next()) {
616    if (p->hash() == hash && p->symbol() == sym && p->symbol_mode() == sym_mode) {
617      return p;
618    }
619  }
620  return NULL;
621}
622
623
624SymbolPropertyEntry* SymbolPropertyTable::add_entry(int index, unsigned int hash,
625                                                    Symbol* sym, intptr_t sym_mode) {
626  assert_locked_or_safepoint(SystemDictionary_lock);
627  assert(index == index_for(sym, sym_mode), "incorrect index?");
628  assert(find_entry(index, hash, sym, sym_mode) == NULL, "no double entry");
629
630  SymbolPropertyEntry* p = new_entry(hash, sym, sym_mode);
631  Hashtable<Symbol*, mtSymbol>::add_entry(index, p);
632  return p;
633}
634
635void SymbolPropertyTable::oops_do(OopClosure* f) {
636  for (int index = 0; index < table_size(); index++) {
637    for (SymbolPropertyEntry* p = bucket(index); p != NULL; p = p->next()) {
638      if (p->method_type() != NULL) {
639        f->do_oop(p->method_type_addr());
640      }
641    }
642  }
643}
644
645void SymbolPropertyTable::methods_do(void f(Method*)) {
646  for (int index = 0; index < table_size(); index++) {
647    for (SymbolPropertyEntry* p = bucket(index); p != NULL; p = p->next()) {
648      Method* prop = p->method();
649      if (prop != NULL) {
650        f((Method*)prop);
651      }
652    }
653  }
654}
655
656
657// ----------------------------------------------------------------------------
658#ifndef PRODUCT
659
660void Dictionary::print() {
661  ResourceMark rm;
662  HandleMark   hm;
663
664  tty->print_cr("Java system dictionary (table_size=%d, classes=%d)",
665                 table_size(), number_of_entries());
666  tty->print_cr("^ indicates that initiating loader is different from "
667                "defining loader");
668
669  for (int index = 0; index < table_size(); index++) {
670    for (DictionaryEntry* probe = bucket(index);
671                          probe != NULL;
672                          probe = probe->next()) {
673      if (Verbose) tty->print("%4d: ", index);
674      Klass* e = probe->klass();
675      ClassLoaderData* loader_data =  probe->loader_data();
676      bool is_defining_class =
677         (loader_data == InstanceKlass::cast(e)->class_loader_data());
678      tty->print("%s%s", is_defining_class ? " " : "^",
679                   e->external_name());
680
681        tty->print(", loader ");
682      loader_data->print_value();
683      tty->cr();
684    }
685  }
686  tty->cr();
687  _pd_cache_table->print();
688  tty->cr();
689}
690
691#endif
692
693void Dictionary::verify() {
694  guarantee(number_of_entries() >= 0, "Verify of system dictionary failed");
695
696  int element_count = 0;
697  for (int index = 0; index < table_size(); index++) {
698    for (DictionaryEntry* probe = bucket(index);
699                          probe != NULL;
700                          probe = probe->next()) {
701      Klass* e = probe->klass();
702      ClassLoaderData* loader_data = probe->loader_data();
703      guarantee(e->oop_is_instance(),
704                              "Verify of system dictionary failed");
705      // class loader must be present;  a null class loader is the
706      // boostrap loader
707      guarantee(loader_data != NULL || DumpSharedSpaces ||
708                loader_data->class_loader() == NULL ||
709                loader_data->class_loader()->is_instance(),
710                "checking type of class_loader");
711      e->verify();
712      probe->verify_protection_domain_set();
713      element_count++;
714    }
715  }
716  guarantee(number_of_entries() == element_count,
717            "Verify of system dictionary failed");
718  debug_only(verify_lookup_length((double)number_of_entries() / table_size()));
719
720  _pd_cache_table->verify();
721}
722
723