1 import java.util.List; 2 import java.lang.management.ManagementFactory; 3 import java.lang.management.MemoryManagerMXBean; 4 import java.lang.management.MemoryPoolMXBean; 5 import java.lang.management.MemoryUsage; 6 7 /* @test TestMetaspaceMemoryPools 8 * @bug 8000754 9 * @summary Tests that two MemoryPoolMXBeans, one for metaspace and one for 10 * class metaspace, is created and that a MemoryManagerMXBean is 11 * created. 12 * @run main/othervm TestMetaspaceMemoryPools defined undefined 13 * @run main/othervm -XX:-UseCompressedKlassPointers TestMetaspaceMemoryPools undefined undefined 14 * @run main/othervm -XX:-UseCompressedKlassPointers -XX:MaxMetaspaceSize=60m TestMetaspaceMemoryPools undefined defined 15 */ 16 public class TestMetaspaceMemoryPools { 17 public static void main(String[] args) { 18 boolean isClassMetaspaceMaxDefined = args[0].equals("defined"); 19 boolean isMetaspaceMaxDefined = args[1].equals("defined"); 20 21 verifyThatMetaspaceMemoryManagerExists(); 22 23 verifyMemoryPool(getMemoryPool("Class Metaspace"), isClassMetaspaceMaxDefined); 24 verifyMemoryPool(getMemoryPool("Metaspace"), isMetaspaceMaxDefined); 25 } 26 27 private static void verifyThatMetaspaceMemoryManagerExists() { 28 List<MemoryManagerMXBean> managers = ManagementFactory.getMemoryManagerMXBeans(); 29 for (MemoryManagerMXBean manager : managers) { 30 if (manager.getName().equals("MetaspaceManager")) { 31 return; 32 } 33 } 34 35 throw new RuntimeException("Expected to find a metaspace memory manager"); 36 } 37 38 private static MemoryPoolMXBean getMemoryPool(String name) { 39 List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans(); 40 for (MemoryPoolMXBean pool : pools) { 41 if (pool.getName().equals(name)) { 42 return pool; 43 } 44 } 45 46 throw new RuntimeException("Expected to find a memory pool with name " + name); 47 } 48 49 private static void verifyMemoryPool(MemoryPoolMXBean pool, boolean isMaxDefined) { 50 MemoryUsage mu = pool.getUsage(); 51 assertDefined(mu.getInit(), "init"); 52 assertDefined(mu.getUsed(), "used"); 53 assertDefined(mu.getCommitted(), "committed"); 54 55 if (isMaxDefined) { 56 assertDefined(mu.getMax(), "max"); 57 } else { 58 assertUndefined(mu.getMax(), "max"); 59 } 60 } 61 62 private static void assertDefined(long value, String name) { 63 assertTrue(value != -1, "Expected " + name + " to be defined"); 64 } 65 66 private static void assertUndefined(long value, String name) { 67 assertTrue(value == -1, "Expected " + name + " to be undefined"); 68 } 69 70 private static void assertTrue(boolean condition, String msg) { 71 if (!condition) { 72 throw new RuntimeException(msg); 73 } 74 } 75 }