本文主要研究一下skywalking的GCProviderjava
skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCProvider.javagit
public enum GCProvider { INSTANCE; private GCMetricAccessor metricAccessor; private List<GarbageCollectorMXBean> beans; GCProvider() { beans = ManagementFactory.getGarbageCollectorMXBeans(); for (GarbageCollectorMXBean bean : beans) { String name = bean.getName(); GCMetricAccessor accessor = findByBeanName(name); if (accessor != null) { metricAccessor = accessor; break; } } if (metricAccessor == null) { this.metricAccessor = new UnknowGC(); } } public List<GC> getGCList() { return metricAccessor.getGCList(); } private GCMetricAccessor findByBeanName(String name) { if (name.indexOf("PS") > -1) { //Parallel (Old) collector ( -XX:+UseParallelOldGC ) return new ParallelGCModule(beans); } else if (name.indexOf("ConcurrentMarkSweep") > -1) { // CMS collector ( -XX:+UseConcMarkSweepGC ) return new CMSGCModule(beans); } else if (name.indexOf("G1") > -1) { // G1 collector ( -XX:+UseG1GC ) return new G1GCModule(beans); } else if (name.equals("MarkSweepCompact")) { // Serial collector ( -XX:+UseSerialGC ) return new SerialGCModule(beans); } else { // Unknown return null; } } }
返回空的的NEW、OLD指標
);其getGCList則經過metricAccessor.getGCList()返回GC指標skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCModule.javagithub
public abstract class GCModule implements GCMetricAccessor { private List<GarbageCollectorMXBean> beans; private long lastOGCCount = 0; private long lastYGCCount = 0; private long lastOGCCollectionTime = 0; private long lastYGCCollectionTime = 0; public GCModule(List<GarbageCollectorMXBean> beans) { this.beans = beans; } @Override public List<GC> getGCList() { List<GC> gcList = new LinkedList<GC>(); for (GarbageCollectorMXBean bean : beans) { String name = bean.getName(); GCPhrase phrase; long gcCount = 0; long gcTime = 0; if (name.equals(getNewGCName())) { phrase = GCPhrase.NEW; long collectionCount = bean.getCollectionCount(); gcCount = collectionCount - lastYGCCount; lastYGCCount = collectionCount; long time = bean.getCollectionTime(); gcTime = time - lastYGCCollectionTime; lastYGCCollectionTime = time; } else if (name.equals(getOldGCName())) { phrase = GCPhrase.OLD; long collectionCount = bean.getCollectionCount(); gcCount = collectionCount - lastOGCCount; lastOGCCount = collectionCount; long time = bean.getCollectionTime(); gcTime = time - lastOGCCollectionTime; lastOGCCollectionTime = time; } else { continue; } gcList.add( GC.newBuilder().setPhrase(phrase) .setCount(gcCount) .setTime(gcTime) .build() ); } return gcList; } protected abstract String getOldGCName(); protected abstract String getNewGCName(); }
GCProvider的構造器經過ManagementFactory.getGarbageCollectorMXBeans()獲取GarbageCollectorMXBean列表,以後遍歷該列表獲取GCMetricAccessor,若是找不到則默認爲UnknowGC(返回空的的NEW、OLD指標
);其getGCList則經過metricAccessor.getGCList()返回GC指標apache