序
本文主要研究一下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 usageBeforeGc;
private final Map 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(poolNames.length);
this.usageAfterGc = new HashMap(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 getMemoryUsageBeforeGc() {
return Collections.unmodifiableMap(usageBeforeGc);
}
public Map 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
)中的key也不尽相同
doc
- GarbageCollectionNotificationInfo