本文主要研究一下GarbageCollectionNotificationInfo

CompositeData

java.management/javax/management/openmbean/CompositeData.java

public interface CompositeData {

    public CompositeType getCompositeType();

    public Object get(String key) ;

    public Object[] getAll(String[] keys) ;

    public boolean containsKey(String key) ;

    public boolean containsValue(Object value) ;

    public Collection<?> values() ;

    public boolean equals(Object obj) ;

    public int hashCode() ;

    public String toString() ;

}
  • CompositeData接口定义了getCompositeType、get、getAll、containsKey、containsValue、values、equals、hashCode、toString方法

CompositeDataView

java.management/javax/management/openmbean/CompositeDataView.java

public interface CompositeDataView {

    public CompositeData toCompositeData(CompositeType ct);
}
  • CompositeDataView接口定义了toCompositeData方法,用于将数据转换为CompositeData

GcInfo

jdk.management/com/sun/management/GcInfo.java

public class GcInfo implements CompositeData, CompositeDataView {
    private final long index;
    private final long startTime;
    private final long endTime;
    private final Map<String, MemoryUsage> usageBeforeGc;
    private final Map<String, MemoryUsage> usageAfterGc;
    private final Object[] extAttributes;
    private final CompositeData cdata;
    private final GcInfoBuilder builder;

    private GcInfo(GcInfoBuilder builder,
                   long index, long startTime, long endTime,
                   MemoryUsage[] muBeforeGc,
                   MemoryUsage[] muAfterGc,
                   Object[] extAttributes) {
        this.builder       = builder;
        this.index         = index;
        this.startTime     = startTime;
        this.endTime       = endTime;
        String[] poolNames = builder.getPoolNames();
        this.usageBeforeGc = new HashMap<String, MemoryUsage>(poolNames.length);
        this.usageAfterGc = new HashMap<String, MemoryUsage>(poolNames.length);
        for (int i = 0; i < poolNames.length; i++) {
            this.usageBeforeGc.put(poolNames[i],  muBeforeGc[i]);
            this.usageAfterGc.put(poolNames[i],  muAfterGc[i]);
        }
        this.extAttributes = extAttributes;
        this.cdata = new GcInfoCompositeData(this, builder, extAttributes);
    }

    private GcInfo(CompositeData cd) {
        GcInfoCompositeData.validateCompositeData(cd);

        this.index         = GcInfoCompositeData.getId(cd);
        this.startTime     = GcInfoCompositeData.getStartTime(cd);
        this.endTime       = GcInfoCompositeData.getEndTime(cd);
        this.usageBeforeGc = GcInfoCompositeData.getMemoryUsageBeforeGc(cd);
        this.usageAfterGc  = GcInfoCompositeData.getMemoryUsageAfterGc(cd);
        this.extAttributes = null;
        this.builder       = null;
        this.cdata         = cd;
    }

    public long getId() {
        return index;
    }

    public long getStartTime() {
        return startTime;
    }

    public long getEndTime() {
        return endTime;
    }

    public long getDuration() {
        return endTime - startTime;
    }

    public Map<String, MemoryUsage> getMemoryUsageBeforeGc() {
        return Collections.unmodifiableMap(usageBeforeGc);
    }

    public Map<String, MemoryUsage> getMemoryUsageAfterGc() {
        return Collections.unmodifiableMap(usageAfterGc);
    }

    public static GcInfo from(CompositeData cd) {
        if (cd == null) {
            return null;
        }

        if (cd instanceof GcInfoCompositeData) {
            return ((GcInfoCompositeData) cd).getGcInfo();
        } else {
            return new GcInfo(cd);
        }

    }

    // Implementation of the CompositeData interface
    public boolean containsKey(String key) {
        return cdata.containsKey(key);
    }

    public boolean containsValue(Object value) {
        return cdata.containsValue(value);
    }

    public boolean equals(Object obj) {
        return cdata.equals(obj);
    }

    public Object get(String key) {
        return cdata.get(key);
    }

    public Object[] getAll(String[] keys) {
        return cdata.getAll(keys);
    }

    public CompositeType getCompositeType() {
        return cdata.getCompositeType();
    }

    public int hashCode() {
        return cdata.hashCode();
    }

    public String toString() {
        return cdata.toString();
    }

    public Collection<?> values() {
        return cdata.values();
    }

    public CompositeData toCompositeData(CompositeType ct) {
        return cdata;
    }
}
  • GcInfo实现了CompositeData及CompositeDataView接口,它主要有index、startTime、endTime、usageBeforeGc、usageAfterGc、extAttributes、cdata这几个属性

GarbageCollectionNotificationInfo

jdk.management/com/sun/management/GarbageCollectionNotificationInfo.java

public class GarbageCollectionNotificationInfo implements  CompositeDataView {

    private final String gcName;
    private final String gcAction;
    private final String gcCause;
    private final GcInfo gcInfo;
    private final CompositeData cdata;

    public static final String GARBAGE_COLLECTION_NOTIFICATION =
        "com.sun.management.gc.notification";

    public GarbageCollectionNotificationInfo(String gcName,
                                             String gcAction,
                                             String gcCause,
                                             GcInfo gcInfo)  {
        if (gcName == null) {
            throw new NullPointerException("Null gcName");
        }
        if (gcAction == null) {
            throw new NullPointerException("Null gcAction");
        }
        if (gcCause == null) {
            throw new NullPointerException("Null gcCause");
        }
        this.gcName = gcName;
        this.gcAction = gcAction;
        this.gcCause = gcCause;
        this.gcInfo = gcInfo;
        this.cdata = new GarbageCollectionNotifInfoCompositeData(this);
    }

    GarbageCollectionNotificationInfo(CompositeData cd) {
        GarbageCollectionNotifInfoCompositeData.validateCompositeData(cd);

        this.gcName = GarbageCollectionNotifInfoCompositeData.getGcName(cd);
        this.gcAction = GarbageCollectionNotifInfoCompositeData.getGcAction(cd);
        this.gcCause = GarbageCollectionNotifInfoCompositeData.getGcCause(cd);
        this.gcInfo = GarbageCollectionNotifInfoCompositeData.getGcInfo(cd);
        this.cdata = cd;
    }

    public String getGcName() {
        return gcName;
    }

    public String getGcAction() {
        return gcAction;
    }

    public String getGcCause() {
        return gcCause;
    }

    public GcInfo getGcInfo() {
        return gcInfo;
    }

    public static GarbageCollectionNotificationInfo from(CompositeData cd) {
        if (cd == null) {
            return null;
        }

        if (cd instanceof GarbageCollectionNotifInfoCompositeData) {
            return ((GarbageCollectionNotifInfoCompositeData) cd).getGarbageCollectionNotifInfo();
        } else {
            return new GarbageCollectionNotificationInfo(cd);
        }
    }

    public CompositeData toCompositeData(CompositeType ct) {
        return cdata;
    }

}
  • GarbageCollectionNotificationInfo实现了CompositeDataView接口的toCompositeData方法,它主要有gcName、gcAction、gcCause、gcInfo、cdata这几个属性,toCompositeData返回的是cdata

实例

G1

  • G1 Young Generation
{
  "gcAction": "end of minor GC",
  "gcCause": "G1 Evacuation Pause",
  "gcInfo": {
    "compositeType": {
      "className": "javax.management.openmbean.CompositeData",
      "description": "CompositeType for GC info for G1 Young Generation",
      "typeName": "sun.management.G1 Young Generation.GcInfoCompositeType"
    },
    "duration": 29,
    "endTime": 18593,
    "id": 38,
    "memoryUsageAfterGc": {
      "CodeHeap 'profiled nmethods'": {
        "committed": 8847360,
        "init": 2555904,
        "max": 122912768,
        "used": 8816000
      },
      "G1 Old Gen": {
        "committed": 88080384,
        "init": 17825792,
        "max": 524288000,
        "used": 62842880
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 1793408
      },
      "G1 Survivor Space": {
        "committed": 2097152,
        "init": 0,
        "max": -1,
        "used": 2097152
      },
      "Compressed Class Space": {
        "committed": 6160384,
        "init": 0,
        "max": 1073741824,
        "used": 5670976
      },
      "Metaspace": {
        "committed": 49676288,
        "init": 0,
        "max": -1,
        "used": 48404152
      },
      "G1 Eden Space": {
        "committed": 13631488,
        "init": 15728640,
        "max": -1,
        "used": 0
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1199360
      }
    },
    "memoryUsageBeforeGc": {
      "CodeHeap 'profiled nmethods'": {
        "committed": 8847360,
        "init": 2555904,
        "max": 122912768,
        "used": 8816000
      },
      "G1 Old Gen": {
        "committed": 89128960,
        "init": 17825792,
        "max": 524288000,
        "used": 59823984
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 1793408
      },
      "G1 Survivor Space": {
        "committed": 1048576,
        "init": 0,
        "max": -1,
        "used": 1048576
      },
      "Compressed Class Space": {
        "committed": 6160384,
        "init": 0,
        "max": 1073741824,
        "used": 5670976
      },
      "Metaspace": {
        "committed": 49676288,
        "init": 0,
        "max": -1,
        "used": 48404152
      },
      "G1 Eden Space": {
        "committed": 13631488,
        "init": 15728640,
        "max": -1,
        "used": 12582912
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1199360
      }
    },
    "startTime": 18564
  },
  "gcName": "G1 Young Generation"
}
  • G1 Old Generation
{
  "gcAction": "end of major GC",
  "gcCause": "G1 Evacuation Pause",
  "gcInfo": {
    "compositeType": {
      "className": "javax.management.openmbean.CompositeData",
      "description": "CompositeType for GC info for G1 Old Generation",
      "typeName": "sun.management.G1 Old Generation.GcInfoCompositeType"
    },
    "duration": 127,
    "endTime": 14107,
    "id": 2,
    "memoryUsageAfterGc": {
      "CodeHeap 'profiled nmethods'": {
        "committed": 9043968,
        "init": 2555904,
        "max": 122912768,
        "used": 9008768
      },
      "G1 Old Gen": {
        "committed": 50331648,
        "init": 15728640,
        "max": 67108864,
        "used": 50126800
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 1814144
      },
      "G1 Survivor Space": {
        "committed": 0,
        "init": 0,
        "max": -1,
        "used": 0
      },
      "Compressed Class Space": {
        "committed": 6160384,
        "init": 0,
        "max": 1073741824,
        "used": 5631528
      },
      "Metaspace": {
        "committed": 49676288,
        "init": 0,
        "max": -1,
        "used": 48270608
      },
      "G1 Eden Space": {
        "committed": 16777216,
        "init": 17825792,
        "max": -1,
        "used": 0
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1197696
      }
    },
    "memoryUsageBeforeGc": {
      "CodeHeap 'profiled nmethods'": {
        "committed": 9043968,
        "init": 2555904,
        "max": 122912768,
        "used": 9008768
      },
      "G1 Old Gen": {
        "committed": 65011712,
        "init": 15728640,
        "max": 67108864,
        "used": 64820264
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 1814144
      },
      "G1 Survivor Space": {
        "committed": 1048576,
        "init": 0,
        "max": -1,
        "used": 1048576
      },
      "Compressed Class Space": {
        "committed": 6160384,
        "init": 0,
        "max": 1073741824,
        "used": 5664624
      },
      "Metaspace": {
        "committed": 49676288,
        "init": 0,
        "max": -1,
        "used": 48375680
      },
      "G1 Eden Space": {
        "committed": 1048576,
        "init": 17825792,
        "max": -1,
        "used": 0
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1197696
      }
    },
    "startTime": 13980
  },
  "gcName": "G1 Old Generation"
}

ZGC

  • ZGC Warmup
{
  "gcAction": "end of major GC",
  "gcCause": "Warmup",
  "gcInfo": {
    "compositeType": {
      "className": "javax.management.openmbean.CompositeData",
      "description": "CompositeType for GC info for ZGC",
      "typeName": "sun.management.ZGC.GcInfoCompositeType"
    },
    "duration": 6562,
    "endTime": 28676,
    "id": 2,
    "memoryUsageAfterGc": {
      "ZHeap": {
        "committed": 2145386496,
        "init": 2147483648,
        "max": 2147483648,
        "used": 656408576
      },
      "CodeHeap 'profiled nmethods'": {
        "committed": 9830400,
        "init": 2555904,
        "max": 122912768,
        "used": 9767424
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 2076288
      },
      "Metaspace": {
        "committed": 49020928,
        "init": 0,
        "max": -1,
        "used": 47278192
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1190528
      }
    },
    "memoryUsageBeforeGc": {
      "ZHeap": {
        "committed": 2145386496,
        "init": 2147483648,
        "max": 2147483648,
        "used": 444596224
      },
      "CodeHeap 'profiled nmethods'": {
        "committed": 9568256,
        "init": 2555904,
        "max": 122912768,
        "used": 9546880
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 2051968
      },
      "Metaspace": {
        "committed": 49020928,
        "init": 0,
        "max": -1,
        "used": 47895808
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1184768
      }
    },
    "startTime": 22114
  },
  "gcName": "ZGC"
}
  • ZGC Allocation Rate
{
  "gcAction": "end of major GC",
  "gcCause": "Allocation Rate",
  "gcInfo": {
    "compositeType": {
      "className": "javax.management.openmbean.CompositeData",
      "description": "CompositeType for GC info for ZGC",
      "typeName": "sun.management.ZGC.GcInfoCompositeType"
    },
    "duration": 1028,
    "endTime": 288728,
    "id": 3,
    "memoryUsageAfterGc": {
      "ZHeap": {
        "committed": 2145386496,
        "init": 2147483648,
        "max": 2147483648,
        "used": 278921216
      },
      "CodeHeap 'profiled nmethods'": {
        "committed": 11206656,
        "init": 2555904,
        "max": 122912768,
        "used": 11141248
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 2198656
      },
      "Metaspace": {
        "committed": 49283072,
        "init": 0,
        "max": -1,
        "used": 48287392
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1184768
      }
    },
    "memoryUsageBeforeGc": {
      "ZHeap": {
        "committed": 2145386496,
        "init": 2147483648,
        "max": 2147483648,
        "used": 236978176
      },
      "CodeHeap 'profiled nmethods'": {
        "committed": 11010048,
        "init": 2555904,
        "max": 122912768,
        "used": 11005568
      },
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 122916864,
        "used": 2197632
      },
      "Metaspace": {
        "committed": 48758784,
        "init": 0,
        "max": -1,
        "used": 47908112
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 5828608,
        "used": 1184128
      }
    },
    "startTime": 287700
  },
  "gcName": "ZGC"
}

Shenandoah

  • Shenandoah Cycles
{
  "gcAction": "end of GC cycle",
  "gcCause": "No GC",
  "gcInfo": {
    "compositeType": {
      "className": "javax.management.openmbean.CompositeData",
      "description": "CompositeType for GC info for Shenandoah Cycles",
      "typeName": "sun.management.Shenandoah Cycles.GcInfoCompositeType"
    },
    "duration": 18,
    "endTime": 1201551,
    "id": 5,
    "memoryUsageAfterGc": {
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 9371648,
        "init": 2555904,
        "max": 244105216,
        "used": 9310592
      },
      "Shenandoah": {
        "committed": 54525952,
        "init": 4294967296,
        "max": 4294967296,
        "used": 34113640
      },
      "Compressed Class Space": {
        "committed": 5373952,
        "init": 0,
        "max": 1073741824,
        "used": 4724464
      },
      "Metaspace": {
        "committed": 37355520,
        "init": 0,
        "max": -1,
        "used": 35581640
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 7553024,
        "used": 1209216
      }
    },
    "memoryUsageBeforeGc": {
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 9306112,
        "init": 2555904,
        "max": 244105216,
        "used": 9300096
      },
      "Shenandoah": {
        "committed": 54525952,
        "init": 4294967296,
        "max": 4294967296,
        "used": 42502592
      },
      "Compressed Class Space": {
        "committed": 5373952,
        "init": 0,
        "max": 1073741824,
        "used": 4724464
      },
      "Metaspace": {
        "committed": 37355520,
        "init": 0,
        "max": -1,
        "used": 35581640
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 2555904,
        "init": 2555904,
        "max": 7553024,
        "used": 1209216
      }
    },
    "startTime": 1201533
  },
  "gcName": "Shenandoah Cycles"
}
  • Shenandoah Pauses
{
  "gcAction": "end of GC pause",
  "gcCause": "No GC",
  "gcInfo": {
    "compositeType": {
      "className": "javax.management.openmbean.CompositeData",
      "description": "CompositeType for GC info for Shenandoah Pauses",
      "typeName": "sun.management.Shenandoah Pauses.GcInfoCompositeType"
    },
    "duration": 1,
    "endTime": 1201551,
    "id": 20,
    "memoryUsageAfterGc": {
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "Shenandoah": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "Compressed Class Space": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "Metaspace": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      }
    },
    "memoryUsageBeforeGc": {
      "CodeHeap 'non-profiled nmethods'": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "Shenandoah": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "Compressed Class Space": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "Metaspace": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      },
      "CodeHeap 'non-nmethods'": {
        "committed": 0,
        "init": 0,
        "max": 0,
        "used": 0
      }
    },
    "startTime": 1201550
  },
  "gcName": "Shenandoah Pauses"
}

小结

  • GarbageCollectorMXBean在完成一个次垃圾收集的action的时候会发射一个A garbage collection notification,它返回的是GarbageCollectionNotificationInfo
  • GarbageCollectionNotificationInfo实现了CompositeDataView接口的toCompositeData方法,它主要有gcName、gcAction、gcCause、gcInfo、cdata这几个属性,toCompositeData返回的是cdata;GcInfo实现了CompositeData及CompositeDataView接口,它主要有index、startTime、endTime、usageBeforeGc、usageAfterGc、extAttributes、cdata这几个属性
  • 可以发现无论是使用G1 GC、ZGC还是Shenandoah GC,都能从对应的GarbageCollectionNotificationInfo获取相关信息,只是不同的垃圾收集器除了gcName不一样外,它们的usageBeforeGc及usageAfterGc(Map<String, MemoryUsage>)中的key也不尽相同

doc


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...