comparison src/share/vm/prims/jvmtiTagMap.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 588f559105c1
children 1d7922586cf6
comparison
equal deleted inserted replaced
6174:74533f63b116 6197:d2a62e0f25eb
53 // 53 //
54 // Each entry encapsulates a reference to the tagged object 54 // Each entry encapsulates a reference to the tagged object
55 // and the tag value. In addition an entry includes a next pointer which 55 // and the tag value. In addition an entry includes a next pointer which
56 // is used to chain entries together. 56 // is used to chain entries together.
57 57
58 class JvmtiTagHashmapEntry : public CHeapObj { 58 class JvmtiTagHashmapEntry : public CHeapObj<mtInternal> {
59 private: 59 private:
60 friend class JvmtiTagMap; 60 friend class JvmtiTagMap;
61 61
62 oop _object; // tagged object 62 oop _object; // tagged object
63 jlong _tag; // the tag 63 jlong _tag; // the tag
104 // 104 //
105 // A hashmap provides functions for adding, removing, and finding 105 // A hashmap provides functions for adding, removing, and finding
106 // entries. It also provides a function to iterate over all entries 106 // entries. It also provides a function to iterate over all entries
107 // in the hashmap. 107 // in the hashmap.
108 108
109 class JvmtiTagHashmap : public CHeapObj { 109 class JvmtiTagHashmap : public CHeapObj<mtInternal> {
110 private: 110 private:
111 friend class JvmtiTagMap; 111 friend class JvmtiTagMap;
112 112
113 enum { 113 enum {
114 small_trace_threshold = 10000, // threshold for tracing 114 small_trace_threshold = 10000, // threshold for tracing
148 } 148 }
149 _load_factor = load_factor; 149 _load_factor = load_factor;
150 _resize_threshold = (int)(_load_factor * _size); 150 _resize_threshold = (int)(_load_factor * _size);
151 _resizing_enabled = true; 151 _resizing_enabled = true;
152 size_t s = initial_size * sizeof(JvmtiTagHashmapEntry*); 152 size_t s = initial_size * sizeof(JvmtiTagHashmapEntry*);
153 _table = (JvmtiTagHashmapEntry**)os::malloc(s); 153 _table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal);
154 if (_table == NULL) { 154 if (_table == NULL) {
155 vm_exit_out_of_memory(s, "unable to allocate initial hashtable for jvmti object tags"); 155 vm_exit_out_of_memory(s, "unable to allocate initial hashtable for jvmti object tags");
156 } 156 }
157 for (int i=0; i<initial_size; i++) { 157 for (int i=0; i<initial_size; i++) {
158 _table[i] = NULL; 158 _table[i] = NULL;
186 return; 186 return;
187 } 187 }
188 188
189 // allocate new table 189 // allocate new table
190 size_t s = new_size * sizeof(JvmtiTagHashmapEntry*); 190 size_t s = new_size * sizeof(JvmtiTagHashmapEntry*);
191 JvmtiTagHashmapEntry** new_table = (JvmtiTagHashmapEntry**)os::malloc(s); 191 JvmtiTagHashmapEntry** new_table = (JvmtiTagHashmapEntry**)os::malloc(s, mtInternal);
192 if (new_table == NULL) { 192 if (new_table == NULL) {
193 warning("unable to allocate larger hashtable for jvmti object tags"); 193 warning("unable to allocate larger hashtable for jvmti object tags");
194 set_resizing_enabled(false); 194 set_resizing_enabled(false);
195 return; 195 return;
196 } 196 }
774 774
775 // Helper class used to describe the static or instance fields of a class. 775 // Helper class used to describe the static or instance fields of a class.
776 // For each field it holds the field index (as defined by the JVMTI specification), 776 // For each field it holds the field index (as defined by the JVMTI specification),
777 // the field type, and the offset. 777 // the field type, and the offset.
778 778
779 class ClassFieldDescriptor: public CHeapObj { 779 class ClassFieldDescriptor: public CHeapObj<mtInternal> {
780 private: 780 private:
781 int _field_index; 781 int _field_index;
782 int _field_offset; 782 int _field_offset;
783 char _field_type; 783 char _field_type;
784 public: 784 public:
788 int field_index() const { return _field_index; } 788 int field_index() const { return _field_index; }
789 char field_type() const { return _field_type; } 789 char field_type() const { return _field_type; }
790 int field_offset() const { return _field_offset; } 790 int field_offset() const { return _field_offset; }
791 }; 791 };
792 792
793 class ClassFieldMap: public CHeapObj { 793 class ClassFieldMap: public CHeapObj<mtInternal> {
794 private: 794 private:
795 enum { 795 enum {
796 initial_field_count = 5 796 initial_field_count = 5
797 }; 797 };
798 798
819 static ClassFieldMap* create_map_of_static_fields(klassOop k); 819 static ClassFieldMap* create_map_of_static_fields(klassOop k);
820 static ClassFieldMap* create_map_of_instance_fields(oop obj); 820 static ClassFieldMap* create_map_of_instance_fields(oop obj);
821 }; 821 };
822 822
823 ClassFieldMap::ClassFieldMap() { 823 ClassFieldMap::ClassFieldMap() {
824 _fields = new (ResourceObj::C_HEAP) GrowableArray<ClassFieldDescriptor*>(initial_field_count, true); 824 _fields = new (ResourceObj::C_HEAP, mtInternal)
825 GrowableArray<ClassFieldDescriptor*>(initial_field_count, true);
825 } 826 }
826 827
827 ClassFieldMap::~ClassFieldMap() { 828 ClassFieldMap::~ClassFieldMap() {
828 for (int i=0; i<_fields->length(); i++) { 829 for (int i=0; i<_fields->length(); i++) {
829 delete _fields->at(i); 830 delete _fields->at(i);
890 // Helper class used to cache a ClassFileMap for the instance fields of 891 // Helper class used to cache a ClassFileMap for the instance fields of
891 // a cache. A JvmtiCachedClassFieldMap can be cached by an instanceKlass during 892 // a cache. A JvmtiCachedClassFieldMap can be cached by an instanceKlass during
892 // heap iteration and avoid creating a field map for each object in the heap 893 // heap iteration and avoid creating a field map for each object in the heap
893 // (only need to create the map when the first instance of a class is encountered). 894 // (only need to create the map when the first instance of a class is encountered).
894 // 895 //
895 class JvmtiCachedClassFieldMap : public CHeapObj { 896 class JvmtiCachedClassFieldMap : public CHeapObj<mtInternal> {
896 private: 897 private:
897 enum { 898 enum {
898 initial_class_count = 200 899 initial_class_count = 200
899 }; 900 };
900 ClassFieldMap* _field_map; 901 ClassFieldMap* _field_map;
955 956
956 957
957 // record that the given instanceKlass is caching a field map 958 // record that the given instanceKlass is caching a field map
958 void JvmtiCachedClassFieldMap::add_to_class_list(instanceKlass* ik) { 959 void JvmtiCachedClassFieldMap::add_to_class_list(instanceKlass* ik) {
959 if (_class_list == NULL) { 960 if (_class_list == NULL) {
960 _class_list = new (ResourceObj::C_HEAP) GrowableArray<instanceKlass*>(initial_class_count, true); 961 _class_list = new (ResourceObj::C_HEAP, mtInternal)
962 GrowableArray<instanceKlass*>(initial_class_count, true);
961 } 963 }
962 _class_list->push(ik); 964 _class_list->push(ik);
963 } 965 }
964 966
965 // returns the instance field map for the given object 967 // returns the instance field map for the given object
1524 public: 1526 public:
1525 TagObjectCollector(JvmtiEnv* env, const jlong* tags, jint tag_count) { 1527 TagObjectCollector(JvmtiEnv* env, const jlong* tags, jint tag_count) {
1526 _env = env; 1528 _env = env;
1527 _tags = (jlong*)tags; 1529 _tags = (jlong*)tags;
1528 _tag_count = tag_count; 1530 _tag_count = tag_count;
1529 _object_results = new (ResourceObj::C_HEAP) GrowableArray<jobject>(1,true); 1531 _object_results = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jobject>(1,true);
1530 _tag_results = new (ResourceObj::C_HEAP) GrowableArray<uint64_t>(1,true); 1532 _tag_results = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<uint64_t>(1,true);
1531 } 1533 }
1532 1534
1533 ~TagObjectCollector() { 1535 ~TagObjectCollector() {
1534 delete _object_results; 1536 delete _object_results;
1535 delete _tag_results; 1537 delete _tag_results;
1670 1672
1671 // prepare heap for iteration 1673 // prepare heap for iteration
1672 Universe::heap()->ensure_parsability(false); // no need to retire TLABs 1674 Universe::heap()->ensure_parsability(false); // no need to retire TLABs
1673 1675
1674 // create stacks for interesting headers 1676 // create stacks for interesting headers
1675 _saved_mark_stack = new (ResourceObj::C_HEAP) GrowableArray<markOop>(4000, true); 1677 _saved_mark_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<markOop>(4000, true);
1676 _saved_oop_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); 1678 _saved_oop_stack = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(4000, true);
1677 1679
1678 if (UseBiasedLocking) { 1680 if (UseBiasedLocking) {
1679 BiasedLocking::preserve_marks(); 1681 BiasedLocking::preserve_marks();
1680 } 1682 }
1681 } 1683 }
2710 bool _reporting_primitive_fields; // optional reporting 2712 bool _reporting_primitive_fields; // optional reporting
2711 bool _reporting_primitive_array_values; 2713 bool _reporting_primitive_array_values;
2712 bool _reporting_string_values; 2714 bool _reporting_string_values;
2713 2715
2714 GrowableArray<oop>* create_visit_stack() { 2716 GrowableArray<oop>* create_visit_stack() {
2715 return new (ResourceObj::C_HEAP) GrowableArray<oop>(initial_visit_stack_size, true); 2717 return new (ResourceObj::C_HEAP, mtInternal) GrowableArray<oop>(initial_visit_stack_size, true);
2716 } 2718 }
2717 2719
2718 // accessors 2720 // accessors
2719 bool is_advanced_heap_walk() const { return _is_advanced_heap_walk; } 2721 bool is_advanced_heap_walk() const { return _is_advanced_heap_walk; }
2720 JvmtiTagMap* tag_map() const { return _tag_map; } 2722 JvmtiTagMap* tag_map() const { return _tag_map; }