Talk about Garbage CollectionNotificationInfo

  jdk

Order

This article mainly studies 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() ;

}
  • The CompositeData interface defines getCompositeType, get, getAll, containsKey, containsValue, values, equals, hashCode, toString methods.

CompositeDataView

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

public interface CompositeDataView {

    public CompositeData toCompositeData(CompositeType ct);
}
  • The CompositeDataView interface defines the tocompositionedata method for converting data toCompositeData

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 implements CompositeData and CompositeDataView interfaces, which mainly include 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 implements the toCompositeData method of the CompositeDataView interface, which mainly includes the following attributes: gcName, gcAction, gcCause, gcInfo, cdata. toCompositeData returns cdata.

Example

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"
}

Summary

  • Garbage CollectionNotification is launched by Garbage CollectionNotification when Garbage CollectionNotification is completed. It returns Garbage CollectionNotification
  • GarbageCollectionNotificationInfo implements the toCompositeData method of the CompositeDataView interface, which mainly includes the following attributes: gcName, gcAction, gcCause, gcInfo, cdata. toCompositeData returns CDATA; GcInfo implements CompositeData and CompositeDataView interfaces, which mainly include index, startTime, endTime, usageBeforeGc, usageAfterGc, extAttributes, cdata.
  • It can be found that whether G1 GC, ZGC or Shenandoah GC is used, relevant information can be obtained from the corresponding Garbage CollectionNotificationInfo, except that different garbage collectors have different usageBeforeGc and usageAfterGc (Map<String, MemoryUsage>) are also different

doc