前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊GarbageCollectionNotificationInfo

聊聊GarbageCollectionNotificationInfo

原创
作者头像
code4it
修改2019-03-24 23:37:53
8360
修改2019-03-24 23:37:53
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下GarbageCollectionNotificationInfo

CompositeData

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

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface CompositeDataView {
​
    public CompositeData toCompositeData(CompositeType ct);
}
  • CompositeDataView接口定义了toCompositeData方法,用于将数据转换为CompositeData

GcInfo

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
代码语言:javascript
复制
{
  "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
代码语言:javascript
复制
{
  "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
代码语言:javascript
复制
{
  "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
代码语言:javascript
复制
{
  "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
代码语言:javascript
复制
{
  "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
代码语言:javascript
复制
{
  "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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CompositeData
  • CompositeDataView
  • GcInfo
  • GarbageCollectionNotificationInfo
  • 实例
    • G1
      • ZGC
        • Shenandoah
        • 小结
        • doc
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档