--- old/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java 2012-09-05 11:24:23.000017562 +0200 +++ new/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java 2012-09-05 11:24:22.800018008 +0200 @@ -48,7 +48,7 @@ private static Map result = new HashMap<>(); private static boolean trace = false; private static boolean testFailed = false; - private static final int EXPECTED_NUM_POOLS = 2; + private static int numMemoryPools = 1; private static final int NUM_GCS = 3; private static final int THRESHOLD = 10; private static Checker checker; @@ -129,14 +129,19 @@ for (MemoryPoolMXBean p : pools) { MemoryUsage u = p.getUsage(); if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) { + if (p.getName().toLowerCase().contains("perm")) { + // if we have a "perm gen" pool increase the number of expected + // memory pools by one. + numMemoryPools++; + } PoolRecord pr = new PoolRecord(p); result.put(p.getName(), pr); - if (result.size() == EXPECTED_NUM_POOLS) { + if (result.size() == numMemoryPools) { break; } } } - if (result.size() != EXPECTED_NUM_POOLS) { + if (result.size() != numMemoryPools) { throw new RuntimeException("Unexpected number of selected pools"); } @@ -209,7 +214,7 @@ public void run() { while (true) { try { - signals.acquire(EXPECTED_NUM_POOLS); + signals.acquire(numMemoryPools); checkResult(); } catch (InterruptedException e) { throw new RuntimeException(e); --- old/test/java/lang/management/MemoryMXBean/MemoryTest.java 2012-09-05 11:24:23.664016081 +0200 +++ new/test/java/lang/management/MemoryMXBean/MemoryTest.java 2012-09-05 11:24:23.464016526 +0200 @@ -58,8 +58,11 @@ // They are: Copy/Scavenger + MSC + CodeCache manager // (or equivalent for other collectors) // Number of GC memory managers = 2 - private static int[] expectedMinNumPools = {3, 2}; - private static int[] expectedMaxNumPools = {3, 4}; + + // Hotspot VM 1.8+ after perm gen removal is expected to have only + // one non-heap memory pool + private static int[] expectedMinNumPools = {3, 1}; + private static int[] expectedMaxNumPools = {3, 1}; private static int expectedNumGCMgrs = 2; private static int expectedNumMgrs = expectedNumGCMgrs + 1; private static String[] types = { "heap", "non-heap" }; @@ -80,6 +83,7 @@ private static void checkMemoryPools() throws Exception { List pools = ManagementFactory.getMemoryPoolMXBeans(); + boolean hasPerm = false; int[] numPools = new int[NUM_TYPES]; for (ListIterator iter = pools.listIterator(); iter.hasNext();) { @@ -90,6 +94,16 @@ if (pool.getType() == MemoryType.NON_HEAP) { numPools[NONHEAP]++; } + if (pool.getName().toLowerCase().contains("perm")) { + hasPerm = true; + } + } + + if (hasPerm) { + // If the VM has perm gen there will be between 2 and 4 non heap + // pools (4 if class data sharing is used) + expectedMinNumPools[NONHEAP] = 2; + expectedMaxNumPools[NONHEAP] = 4; } // Check the number of Memory pools