Wed, 01 Aug 2012 17:19:30 -0400
7185614: NMT ON: "check by caller" assertion failed on nsk ThreadMXBean test
7187429: NMT ON: Merge failure should cause NMT to shutdown
Summary: Fixed NMT assertion failures
Reviewed-by: acorn, kvn
1.1 --- a/src/share/vm/services/memSnapshot.cpp Mon Jul 23 14:28:38 2012 -0700 1.2 +++ b/src/share/vm/services/memSnapshot.cpp Wed Aug 01 17:19:30 2012 -0400 1.3 @@ -344,7 +344,7 @@ 1.4 // due to platform dependent behaviors. On some platforms, we see uncommit/release 1.5 // native thread stack, but some, we don't. 1.6 if (!cur_vm->is_uncommit_record() && !cur_vm->is_deallocation_record()) { 1.7 - ShouldNotReachHere(); 1.8 + fatal(err_msg("Should not reach here, pointer flags = [%x]", cur_vm->flags())); 1.9 } 1.10 #endif 1.11 }
2.1 --- a/src/share/vm/services/memSnapshot.hpp Mon Jul 23 14:28:38 2012 -0700 2.2 +++ b/src/share/vm/services/memSnapshot.hpp Wed Aug 01 17:19:30 2012 -0400 2.3 @@ -63,13 +63,13 @@ 2.4 MemPointer* p1 = (MemPointer*)ptr; 2.5 MemPointer* p2 = (MemPointer*)_array->at(_pos - 1); 2.6 assert(!is_dup_pointer(p1, p2), 2.7 - "dup pointer"); 2.8 + err_msg("duplicated pointer, flag = [%x]", (unsigned int)((MemPointerRecord*)p1)->flags())); 2.9 } 2.10 if (_pos < _array->length() -1) { 2.11 MemPointer* p1 = (MemPointer*)ptr; 2.12 MemPointer* p2 = (MemPointer*)_array->at(_pos + 1); 2.13 assert(!is_dup_pointer(p1, p2), 2.14 - "dup pointer"); 2.15 + err_msg("duplicated pointer, flag = [%x]", (unsigned int)((MemPointerRecord*)p1)->flags())); 2.16 } 2.17 return _array->insert_at(ptr, _pos); 2.18 } 2.19 @@ -79,14 +79,14 @@ 2.20 MemPointer* p1 = (MemPointer*)ptr; 2.21 MemPointer* p2 = (MemPointer*)_array->at(_pos - 1); 2.22 assert(!is_dup_pointer(p1, p2), 2.23 - "dup pointer"); 2.24 + err_msg("duplicated pointer, flag = [%x]", (unsigned int)((MemPointerRecord*)p1)->flags())); 2.25 } 2.26 if (_pos < _array->length() - 1) { 2.27 MemPointer* p1 = (MemPointer*)ptr; 2.28 MemPointer* p2 = (MemPointer*)_array->at(_pos + 1); 2.29 2.30 assert(!is_dup_pointer(p1, p2), 2.31 - "dup pointer"); 2.32 + err_msg("duplicated pointer, flag = [%x]", (unsigned int)((MemPointerRecord*)p1)->flags())); 2.33 } 2.34 if (_array->insert_at(ptr, _pos + 1)) { 2.35 _pos ++;
3.1 --- a/src/share/vm/services/memTrackWorker.cpp Mon Jul 23 14:28:38 2012 -0700 3.2 +++ b/src/share/vm/services/memTrackWorker.cpp Wed Aug 01 17:19:30 2012 -0400 3.3 @@ -99,9 +99,11 @@ 3.4 } 3.5 if (rec != NULL) { 3.6 // merge the recorder into staging area 3.7 - bool result = snapshot->merge(rec); 3.8 - assert(result, "merge failed"); 3.9 - debug_only(_merge_count ++;) 3.10 + if (!snapshot->merge(rec)) { 3.11 + MemTracker::shutdown(MemTracker::NMT_out_of_memory); 3.12 + } else { 3.13 + NOT_PRODUCT(_merge_count ++;) 3.14 + } 3.15 MemTracker::release_thread_recorder(rec); 3.16 } else { 3.17 // no more recorder to merge, promote staging area 3.18 @@ -129,7 +131,7 @@ 3.19 } 3.20 assert(MemTracker::shutdown_in_progress(), "just check"); 3.21 3.22 - // transites to final shutdown 3.23 + // transits to final shutdown 3.24 MemTracker::final_shutdown(); 3.25 } 3.26
4.1 --- a/src/share/vm/services/memTracker.hpp Mon Jul 23 14:28:38 2012 -0700 4.2 +++ b/src/share/vm/services/memTracker.hpp Wed Aug 01 17:19:30 2012 -0400 4.3 @@ -184,7 +184,6 @@ 4.4 // record a 'malloc' call 4.5 static inline void record_malloc(address addr, size_t size, MEMFLAGS flags, 4.6 address pc = 0, Thread* thread = NULL) { 4.7 - assert(is_on(), "check by caller"); 4.8 if (NMT_CAN_TRACK(flags)) { 4.9 create_memory_record(addr, (flags|MemPointerRecord::malloc_tag()), size, pc, thread); 4.10 } 4.11 @@ -285,7 +284,6 @@ 4.12 4.13 // retrieve global snapshot 4.14 static MemSnapshot* get_snapshot() { 4.15 - assert(is_on(), "native memory tracking is off"); 4.16 if (shutdown_in_progress()) { 4.17 return NULL; 4.18 }