Mercurial > hg > truffle
comparison src/share/vm/services/mallocTracker.cpp @ 20630:787c9c28311f
8058251: assert(_count > 0) failed: Negative counter when running runtime/NMT/MallocTrackingVerify.java
Summary: Fixed an issue when overflowing the MallocSite hash table bucket
Reviewed-by: coleenp, gtriantafill
author | ctornqvi |
---|---|
date | Tue, 11 Nov 2014 10:48:06 -0800 |
parents | 417e3b8d04c5 |
children |
comparison
equal
deleted
inserted
replaced
20629:09259e52a610 | 20630:787c9c28311f |
---|---|
70 // Tracking already shutdown, no housekeeping is needed anymore | 70 // Tracking already shutdown, no housekeeping is needed anymore |
71 if (MemTracker::tracking_level() <= NMT_minimal) return; | 71 if (MemTracker::tracking_level() <= NMT_minimal) return; |
72 | 72 |
73 MallocMemorySummary::record_free(size(), flags()); | 73 MallocMemorySummary::record_free(size(), flags()); |
74 MallocMemorySummary::record_free_malloc_header(sizeof(MallocHeader)); | 74 MallocMemorySummary::record_free_malloc_header(sizeof(MallocHeader)); |
75 if (tracking_level() == NMT_detail) { | 75 if (MemTracker::tracking_level() == NMT_detail) { |
76 MallocSiteTable::deallocation_at(size(), _bucket_idx, _pos_idx); | 76 MallocSiteTable::deallocation_at(size(), _bucket_idx, _pos_idx); |
77 } | 77 } |
78 } | 78 } |
79 | 79 |
80 bool MallocHeader::record_malloc_site(const NativeCallStack& stack, size_t size, | 80 bool MallocHeader::record_malloc_site(const NativeCallStack& stack, size_t size, |
126 if (malloc_base == NULL) { | 126 if (malloc_base == NULL) { |
127 return NULL; | 127 return NULL; |
128 } | 128 } |
129 | 129 |
130 // Uses placement global new operator to initialize malloc header | 130 // Uses placement global new operator to initialize malloc header |
131 switch(level) { | 131 |
132 case NMT_off: | 132 if (level == NMT_off) { |
133 return malloc_base; | 133 return malloc_base; |
134 case NMT_minimal: { | |
135 MallocHeader* hdr = ::new (malloc_base) MallocHeader(); | |
136 break; | |
137 } | |
138 case NMT_summary: { | |
139 assert(size <= MAX_MALLOC_SIZE, "malloc size overrun for NMT"); | |
140 header = ::new (malloc_base) MallocHeader(size, flags); | |
141 break; | |
142 } | |
143 case NMT_detail: { | |
144 assert(size <= MAX_MALLOC_SIZE, "malloc size overrun for NMT"); | |
145 header = ::new (malloc_base) MallocHeader(size, flags, stack); | |
146 break; | |
147 } | |
148 default: | |
149 ShouldNotReachHere(); | |
150 } | 134 } |
135 | |
136 header = ::new (malloc_base)MallocHeader(size, flags, stack, level); | |
151 memblock = (void*)((char*)malloc_base + sizeof(MallocHeader)); | 137 memblock = (void*)((char*)malloc_base + sizeof(MallocHeader)); |
152 | 138 |
153 // The alignment check: 8 bytes alignment for 32 bit systems. | 139 // The alignment check: 8 bytes alignment for 32 bit systems. |
154 // 16 bytes alignment for 64-bit systems. | 140 // 16 bytes alignment for 64-bit systems. |
155 assert(((size_t)memblock & (sizeof(size_t) * 2 - 1)) == 0, "Alignment check"); | 141 assert(((size_t)memblock & (sizeof(size_t) * 2 - 1)) == 0, "Alignment check"); |
156 | |
157 // Sanity check | |
158 assert(get_memory_tracking_level(memblock) == level, | |
159 "Wrong tracking level"); | |
160 | 142 |
161 #ifdef ASSERT | 143 #ifdef ASSERT |
162 if (level > NMT_minimal) { | 144 if (level > NMT_minimal) { |
163 // Read back | 145 // Read back |
164 assert(get_size(memblock) == size, "Wrong size"); | 146 assert(get_size(memblock) == size, "Wrong size"); |