< prev index next >

hotspot/test/runtime/NMT/MallocSiteHashOverflow.java

Print this page
rev 6898 : 8062870: src/share/vm/services/mallocTracker.hpp:64 assert(_count > 0) failed: Negative counter
Summary: Signed bitfield size y can only have (1 << y)-1 values.
Reviewed-by: shade, dholmes, jrose, ctornqvi, gtriantafill

*** 22,64 **** */ /* * @test * @summary Test corner case that overflows malloc site hashtable bucket * @key nmt jcmd stress * @library /testlibrary /testlibrary/whitebox - * @ignore - This test is disabled since it will stress NMT and timeout during normal testing * @build MallocSiteHashOverflow * @run main ClassFileInstaller sun.hotspot.WhiteBox ! * @run main/othervm/timeout=480 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail MallocSiteHashOverflow */ import com.oracle.java.testlibrary.*; import sun.hotspot.WhiteBox; public class MallocSiteHashOverflow { ! private static long K = 1024; public static void main(String args[]) throws Exception { - String vm_name = System.getProperty("java.vm.name"); // For 32-bit systems, create 257 malloc sites with the same hash bucket to overflow a hash bucket - // For 64-bit systems, create 64K + 1 malloc sites with the same hash bucket to overflow a hash bucket long entries = 257; - if (Platform.is64bit()) { - entries = 64 * K + 1; - } OutputAnalyzer output; WhiteBox wb = WhiteBox.getWhiteBox(); // Grab my own PID String pid = Integer.toString(ProcessTools.getProcessId()); ProcessBuilder pb = new ProcessBuilder(); ! wb.NMTOverflowHashBucket(entries); ! // Run 'jcmd <pid> VM.native_memory summary' pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "statistics"}); output = new OutputAnalyzer(pb.start()); output.shouldContain("Tracking level has been downgraded due to lack of resources"); } } --- 22,78 ---- */ /* * @test * @summary Test corner case that overflows malloc site hashtable bucket + * @requires sun.arch.data.model == "32" * @key nmt jcmd stress * @library /testlibrary /testlibrary/whitebox * @build MallocSiteHashOverflow * @run main ClassFileInstaller sun.hotspot.WhiteBox ! * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail MallocSiteHashOverflow */ import com.oracle.java.testlibrary.*; import sun.hotspot.WhiteBox; public class MallocSiteHashOverflow { ! public static void main(String args[]) throws Exception { + // Size of entries based on malloc tracking header defined in mallocTracker.hpp // For 32-bit systems, create 257 malloc sites with the same hash bucket to overflow a hash bucket long entries = 257; OutputAnalyzer output; WhiteBox wb = WhiteBox.getWhiteBox(); + int MAX_HASH_SIZE = wb.NMTGetHashSize(); // Grab my own PID String pid = Integer.toString(ProcessTools.getProcessId()); ProcessBuilder pb = new ProcessBuilder(); ! // Verify that current tracking level is "detail" ! pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "statistics"}); ! output = new OutputAnalyzer(pb.start()); ! output.shouldContain("Native Memory Tracking Statistics"); ! // Attempt to cause NMT to downgrade tracking level by allocating small amounts ! // of memory with random pseudo call stack ! int pc = 1; ! for (int i = 0; i < entries; i++) { ! long addr = wb.NMTMallocWithPseudoStack(1, pc); ! if (addr == 0) { ! throw new RuntimeException("NMTMallocWithPseudoStack: out of memory"); ! } ! // We free memory here since it doesn't affect pseudo malloc alloc site hash table entries ! wb.NMTFree(addr); ! pc += MAX_HASH_SIZE; ! if (i == entries) { ! // Verify that tracking has been downgraded pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "statistics"}); output = new OutputAnalyzer(pb.start()); output.shouldContain("Tracking level has been downgraded due to lack of resources"); } + } + } }
< prev index next >