< prev index next >

hotspot/src/share/vm/services/mallocTracker.cpp

Print this page
rev 6886 : 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

*** 70,80 **** // Tracking already shutdown, no housekeeping is needed anymore if (MemTracker::tracking_level() <= NMT_minimal) return; MallocMemorySummary::record_free(size(), flags()); MallocMemorySummary::record_free_malloc_header(sizeof(MallocHeader)); ! if (tracking_level() == NMT_detail) { MallocSiteTable::deallocation_at(size(), _bucket_idx, _pos_idx); } } bool MallocHeader::record_malloc_site(const NativeCallStack& stack, size_t size, --- 70,80 ---- // Tracking already shutdown, no housekeeping is needed anymore if (MemTracker::tracking_level() <= NMT_minimal) return; MallocMemorySummary::record_free(size(), flags()); MallocMemorySummary::record_free_malloc_header(sizeof(MallocHeader)); ! if (MemTracker::tracking_level() == NMT_detail) { MallocSiteTable::deallocation_at(size(), _bucket_idx, _pos_idx); } } bool MallocHeader::record_malloc_site(const NativeCallStack& stack, size_t size,
*** 126,165 **** if (malloc_base == NULL) { return NULL; } // Uses placement global new operator to initialize malloc header ! switch(level) { ! case NMT_off: return malloc_base; - case NMT_minimal: { - MallocHeader* hdr = ::new (malloc_base) MallocHeader(); - break; - } - case NMT_summary: { - assert(size <= MAX_MALLOC_SIZE, "malloc size overrun for NMT"); - header = ::new (malloc_base) MallocHeader(size, flags); - break; - } - case NMT_detail: { - assert(size <= MAX_MALLOC_SIZE, "malloc size overrun for NMT"); - header = ::new (malloc_base) MallocHeader(size, flags, stack); - break; - } - default: - ShouldNotReachHere(); } memblock = (void*)((char*)malloc_base + sizeof(MallocHeader)); // The alignment check: 8 bytes alignment for 32 bit systems. // 16 bytes alignment for 64-bit systems. assert(((size_t)memblock & (sizeof(size_t) * 2 - 1)) == 0, "Alignment check"); - // Sanity check - assert(get_memory_tracking_level(memblock) == level, - "Wrong tracking level"); - #ifdef ASSERT if (level > NMT_minimal) { // Read back assert(get_size(memblock) == size, "Wrong size"); assert(get_flags(memblock) == flags, "Wrong flags"); --- 126,147 ---- if (malloc_base == NULL) { return NULL; } // Uses placement global new operator to initialize malloc header ! ! if (level == NMT_off) { return malloc_base; } + + header = ::new (malloc_base)MallocHeader(size, flags, stack, level); memblock = (void*)((char*)malloc_base + sizeof(MallocHeader)); // The alignment check: 8 bytes alignment for 32 bit systems. // 16 bytes alignment for 64-bit systems. assert(((size_t)memblock & (sizeof(size_t) * 2 - 1)) == 0, "Alignment check"); #ifdef ASSERT if (level > NMT_minimal) { // Read back assert(get_size(memblock) == size, "Wrong size"); assert(get_flags(memblock) == flags, "Wrong flags");
< prev index next >