comparison src/share/vm/oops/instanceKlass.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 8bafad97cd26
children 04ade88d9712
comparison
equal deleted inserted replaced
6174:74533f63b116 6197:d2a62e0f25eb
987 super->do_nonstatic_fields(cl); 987 super->do_nonstatic_fields(cl);
988 } 988 }
989 fieldDescriptor fd; 989 fieldDescriptor fd;
990 int length = java_fields_count(); 990 int length = java_fields_count();
991 // In DebugInfo nonstatic fields are sorted by offset. 991 // In DebugInfo nonstatic fields are sorted by offset.
992 int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1)); 992 int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1), mtClass);
993 int j = 0; 993 int j = 0;
994 for (int i = 0; i < length; i += 1) { 994 for (int i = 0; i < length; i += 1) {
995 fd.initialize(as_klassOop(), i); 995 fd.initialize(as_klassOop(), i);
996 if (!fd.is_static()) { 996 if (!fd.is_static()) {
997 fields_sorted[j + 0] = fd.offset(); 997 fields_sorted[j + 0] = fd.offset();
1007 fd.initialize(as_klassOop(), fields_sorted[i + 1]); 1007 fd.initialize(as_klassOop(), fields_sorted[i + 1]);
1008 assert(!fd.is_static() && fd.offset() == fields_sorted[i], "only nonstatic fields"); 1008 assert(!fd.is_static() && fd.offset() == fields_sorted[i], "only nonstatic fields");
1009 cl->do_field(&fd); 1009 cl->do_field(&fd);
1010 } 1010 }
1011 } 1011 }
1012 FREE_C_HEAP_ARRAY(int, fields_sorted); 1012 FREE_C_HEAP_ARRAY(int, fields_sorted, mtClass);
1013 } 1013 }
1014 1014
1015 1015
1016 void instanceKlass::array_klasses_do(void f(klassOop k)) { 1016 void instanceKlass::array_klasses_do(void f(klassOop k)) {
1017 if (array_klasses() != NULL) 1017 if (array_klasses() != NULL)
1234 // may not allocate new_jmeths or use it if we allocate it 1234 // may not allocate new_jmeths or use it if we allocate it
1235 jmethodID* new_jmeths = NULL; 1235 jmethodID* new_jmeths = NULL;
1236 if (length <= idnum) { 1236 if (length <= idnum) {
1237 // allocate a new cache that might be used 1237 // allocate a new cache that might be used
1238 size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count()); 1238 size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count());
1239 new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1); 1239 new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1, mtClass);
1240 memset(new_jmeths, 0, (size+1)*sizeof(jmethodID)); 1240 memset(new_jmeths, 0, (size+1)*sizeof(jmethodID));
1241 // cache size is stored in element[0], other elements offset by one 1241 // cache size is stored in element[0], other elements offset by one
1242 new_jmeths[0] = (jmethodID)size; 1242 new_jmeths[0] = (jmethodID)size;
1243 } 1243 }
1244 1244
1395 indices = methods_cached_itable_indices_acquire(); 1395 indices = methods_cached_itable_indices_acquire();
1396 size_t length = 0; 1396 size_t length = 0;
1397 // cache size is stored in element[0], other elements offset by one 1397 // cache size is stored in element[0], other elements offset by one
1398 if (indices == NULL || (length = (size_t)indices[0]) <= idnum) { 1398 if (indices == NULL || (length = (size_t)indices[0]) <= idnum) {
1399 size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count()); 1399 size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count());
1400 int* new_indices = NEW_C_HEAP_ARRAY(int, size+1); 1400 int* new_indices = NEW_C_HEAP_ARRAY(int, size+1, mtClass);
1401 new_indices[0] = (int)size; 1401 new_indices[0] = (int)size;
1402 // copy any existing entries 1402 // copy any existing entries
1403 size_t i; 1403 size_t i;
1404 for (i = 0; i < length; i++) { 1404 for (i = 0; i < length; i++) {
1405 new_indices[i+1] = indices[i+1]; 1405 new_indices[i+1] = indices[i+1];
1931 _previous_versions = NULL; 1931 _previous_versions = NULL;
1932 } 1932 }
1933 1933
1934 // deallocate the cached class file 1934 // deallocate the cached class file
1935 if (_cached_class_file_bytes != NULL) { 1935 if (_cached_class_file_bytes != NULL) {
1936 os::free(_cached_class_file_bytes); 1936 os::free(_cached_class_file_bytes, mtClass);
1937 _cached_class_file_bytes = NULL; 1937 _cached_class_file_bytes = NULL;
1938 _cached_class_file_len = 0; 1938 _cached_class_file_len = 0;
1939 } 1939 }
1940 1940
1941 // Decrement symbol reference counts associated with the unloaded class. 1941 // Decrement symbol reference counts associated with the unloaded class.
2528 2528
2529 if (_previous_versions == NULL) { 2529 if (_previous_versions == NULL) {
2530 // This is the first previous version so make some space. 2530 // This is the first previous version so make some space.
2531 // Start with 2 elements under the assumption that the class 2531 // Start with 2 elements under the assumption that the class
2532 // won't be redefined much. 2532 // won't be redefined much.
2533 _previous_versions = new (ResourceObj::C_HEAP) 2533 _previous_versions = new (ResourceObj::C_HEAP, mtClass)
2534 GrowableArray<PreviousVersionNode *>(2, true); 2534 GrowableArray<PreviousVersionNode *>(2, true);
2535 } 2535 }
2536 2536
2537 // RC_TRACE macro has an embedded ResourceMark 2537 // RC_TRACE macro has an embedded ResourceMark
2538 RC_TRACE(0x00000100, ("adding previous version ref for %s @%d, EMCP_cnt=%d", 2538 RC_TRACE(0x00000100, ("adding previous version ref for %s @%d, EMCP_cnt=%d",
2554 pv_node = new PreviousVersionNode(cp_ref, !cp_h->is_shared(), NULL); 2554 pv_node = new PreviousVersionNode(cp_ref, !cp_h->is_shared(), NULL);
2555 RC_TRACE(0x00000400, 2555 RC_TRACE(0x00000400,
2556 ("add: all methods are obsolete; flushing any EMCP weak refs")); 2556 ("add: all methods are obsolete; flushing any EMCP weak refs"));
2557 } else { 2557 } else {
2558 int local_count = 0; 2558 int local_count = 0;
2559 GrowableArray<jweak>* method_refs = new (ResourceObj::C_HEAP) 2559 GrowableArray<jweak>* method_refs = new (ResourceObj::C_HEAP, mtClass)
2560 GrowableArray<jweak>(emcp_method_count, true); 2560 GrowableArray<jweak>(emcp_method_count, true);
2561 for (int i = 0; i < old_methods->length(); i++) { 2561 for (int i = 0; i < old_methods->length(); i++) {
2562 if (emcp_methods->at(i)) { 2562 if (emcp_methods->at(i)) {
2563 // this old method is EMCP so save a weak ref 2563 // this old method is EMCP so save a weak ref
2564 methodOop old_method = (methodOop) old_methods->obj_at(i); 2564 methodOop old_method = (methodOop) old_methods->obj_at(i);
2946 2946
2947 int length = _previous_versions->length(); 2947 int length = _previous_versions->length();
2948 2948
2949 while (_current_index < length) { 2949 while (_current_index < length) {
2950 PreviousVersionNode * pv_node = _previous_versions->at(_current_index++); 2950 PreviousVersionNode * pv_node = _previous_versions->at(_current_index++);
2951 PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP) 2951 PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP, mtClass)
2952 PreviousVersionInfo(pv_node); 2952 PreviousVersionInfo(pv_node);
2953 2953
2954 constantPoolHandle cp_h = pv_info->prev_constant_pool_handle(); 2954 constantPoolHandle cp_h = pv_info->prev_constant_pool_handle();
2955 if (cp_h.is_null()) { 2955 if (cp_h.is_null()) {
2956 delete pv_info; 2956 delete pv_info;