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 }