comparison src/share/vm/classfile/loaderConstraints.cpp @ 6197:d2a62e0f25eb

6995781: Native Memory Tracking (Phase 1) 7151532: DCmd for hotspot native memory tracking Summary: Implementation of native memory tracking phase 1, which tracks VM native memory usage, and related DCmd Reviewed-by: acorn, coleenp, fparain
author zgu
date Thu, 28 Jun 2012 17:03:16 -0400
parents 1d1603768966
children da91efe96a93
comparison
equal deleted inserted replaced
6174:74533f63b116 6197:d2a62e0f25eb
29 #include "runtime/handles.inline.hpp" 29 #include "runtime/handles.inline.hpp"
30 #include "runtime/safepoint.hpp" 30 #include "runtime/safepoint.hpp"
31 #include "utilities/hashtable.inline.hpp" 31 #include "utilities/hashtable.inline.hpp"
32 32
33 LoaderConstraintTable::LoaderConstraintTable(int nof_buckets) 33 LoaderConstraintTable::LoaderConstraintTable(int nof_buckets)
34 : Hashtable<klassOop>(nof_buckets, sizeof(LoaderConstraintEntry)) {}; 34 : Hashtable<klassOop, mtClass>(nof_buckets, sizeof(LoaderConstraintEntry)) {};
35 35
36 36
37 LoaderConstraintEntry* LoaderConstraintTable::new_entry( 37 LoaderConstraintEntry* LoaderConstraintTable::new_entry(
38 unsigned int hash, Symbol* name, 38 unsigned int hash, Symbol* name,
39 klassOop klass, int num_loaders, 39 klassOop klass, int num_loaders,
40 int max_loaders) { 40 int max_loaders) {
41 LoaderConstraintEntry* entry; 41 LoaderConstraintEntry* entry;
42 entry = (LoaderConstraintEntry*)Hashtable<klassOop>::new_entry(hash, klass); 42 entry = (LoaderConstraintEntry*)Hashtable<klassOop, mtClass>::new_entry(hash, klass);
43 entry->set_name(name); 43 entry->set_name(name);
44 entry->set_num_loaders(num_loaders); 44 entry->set_num_loaders(num_loaders);
45 entry->set_max_loaders(max_loaders); 45 entry->set_max_loaders(max_loaders);
46 return entry; 46 return entry;
47 } 47 }
48 48
49 void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) { 49 void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) {
50 // decrement name refcount before freeing 50 // decrement name refcount before freeing
51 entry->name()->decrement_refcount(); 51 entry->name()->decrement_refcount();
52 Hashtable<klassOop>::free_entry(entry); 52 Hashtable<klassOop, mtClass>::free_entry(entry);
53 } 53 }
54 54
55 55
56 void LoaderConstraintTable::oops_do(OopClosure* f) { 56 void LoaderConstraintTable::oops_do(OopClosure* f) {
57 for (int index = 0; index < table_size(); index++) { 57 for (int index = 0; index < table_size(); index++) {
162 probe->name()->as_C_string()); 162 probe->name()->as_C_string());
163 } 163 }
164 164
165 // Purge entry 165 // Purge entry
166 *p = probe->next(); 166 *p = probe->next();
167 FREE_C_HEAP_ARRAY(oop, probe->loaders()); 167 FREE_C_HEAP_ARRAY(oop, probe->loaders(), mtClass);
168 free_entry(probe); 168 free_entry(probe);
169 } else { 169 } else {
170 #ifdef ASSERT 170 #ifdef ASSERT
171 if (probe->klass() != NULL) { 171 if (probe->klass() != NULL) {
172 assert(is_alive->do_object_b(probe->klass()), "klass should be live"); 172 assert(is_alive->do_object_b(probe->klass()), "klass should be live");
222 if (*pp1 == NULL && *pp2 == NULL) { 222 if (*pp1 == NULL && *pp2 == NULL) {
223 unsigned int hash = compute_hash(class_name); 223 unsigned int hash = compute_hash(class_name);
224 int index = hash_to_index(hash); 224 int index = hash_to_index(hash);
225 LoaderConstraintEntry* p; 225 LoaderConstraintEntry* p;
226 p = new_entry(hash, class_name, klass, 2, 2); 226 p = new_entry(hash, class_name, klass, 2, 2);
227 p->set_loaders(NEW_C_HEAP_ARRAY(oop, 2)); 227 p->set_loaders(NEW_C_HEAP_ARRAY(oop, 2, mtClass));
228 p->set_loader(0, class_loader1()); 228 p->set_loader(0, class_loader1());
229 p->set_loader(1, class_loader2()); 229 p->set_loader(1, class_loader2());
230 p->set_klass(klass); 230 p->set_klass(klass);
231 p->set_next(bucket(index)); 231 p->set_next(bucket(index));
232 set_entry(index, p); 232 set_entry(index, p);
338 void LoaderConstraintTable::ensure_loader_constraint_capacity( 338 void LoaderConstraintTable::ensure_loader_constraint_capacity(
339 LoaderConstraintEntry *p, 339 LoaderConstraintEntry *p,
340 int nfree) { 340 int nfree) {
341 if (p->max_loaders() - p->num_loaders() < nfree) { 341 if (p->max_loaders() - p->num_loaders() < nfree) {
342 int n = nfree + p->num_loaders(); 342 int n = nfree + p->num_loaders();
343 oop* new_loaders = NEW_C_HEAP_ARRAY(oop, n); 343 oop* new_loaders = NEW_C_HEAP_ARRAY(oop, n, mtClass);
344 memcpy(new_loaders, p->loaders(), sizeof(oop) * p->num_loaders()); 344 memcpy(new_loaders, p->loaders(), sizeof(oop) * p->num_loaders());
345 p->set_max_loaders(n); 345 p->set_max_loaders(n);
346 FREE_C_HEAP_ARRAY(oop, p->loaders()); 346 FREE_C_HEAP_ARRAY(oop, p->loaders(), mtClass);
347 p->set_loaders(new_loaders); 347 p->set_loaders(new_loaders);
348 } 348 }
349 } 349 }
350 350
351 351
423 } else { 423 } else {
424 assert(p1->klass() == klass, "constraints corrupted"); 424 assert(p1->klass() == klass, "constraints corrupted");
425 } 425 }
426 426
427 *pp2 = p2->next(); 427 *pp2 = p2->next();
428 FREE_C_HEAP_ARRAY(oop, p2->loaders()); 428 FREE_C_HEAP_ARRAY(oop, p2->loaders(), mtClass);
429 free_entry(p2); 429 free_entry(p2);
430 return; 430 return;
431 } 431 }
432 432
433 433