Mercurial > hg > graal-compiler
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 |