Skip to content

Instantly share code, notes, and snippets.

@aikar
Created March 19, 2020 05:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aikar/28464fb6dcef25edfd09a3903a312352 to your computer and use it in GitHub Desktop.
Save aikar/28464fb6dcef25edfd09a3903a312352 to your computer and use it in GitHub Desktop.
/*
* Copyright (c) 2017. Starlis LLC / dba Empire Minecraft
*
* This source code is proprietary software and must not be redistributed without Starlis LLC's approval
*
*/
package com.empireminecraft.systems.tasks;
import com.empireminecraft.util.Log;
import com.empireminecraft.util.MovingAverage;
import com.empireminecraft.util.TimeUtil;
import com.sun.management.GarbageCollectorMXBean;
import com.sun.management.GcInfo;
import javax.management.MBeanServer;
import java.lang.management.ManagementFactory;
@SuppressWarnings("WeakerAccess")
public class GCMonitorTask implements Runnable {
private static volatile GarbageCollectorMXBean youngBean;
private static volatile GarbageCollectorMXBean oldBean;
public static long lastYoung = 0;
public static long lastOld = 0;
public static long oldCount = 0;
public static MovingAverage youngInterval = new MovingAverage(10, TimeUtil.SECOND.inMilli(30));
public static MovingAverage youngDuration = new MovingAverage(10, 50);
static {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
try {
String youngId = "java.lang:type=GarbageCollector,name=G1 Young Generation";
youngBean = ManagementFactory.newPlatformMXBeanProxy(server, youngId, GarbageCollectorMXBean.class);
if (youngBean == null) {
Log.error("Could not find YoungGen Bean");
} else {
GcInfo lastGcInfo = youngBean.getLastGcInfo();
if (lastGcInfo != null) {
lastYoung = lastGcInfo.getStartTime();
} else {
lastYoung = System.currentTimeMillis();
}
}
String oldId = "java.lang:type=GarbageCollector,name=G1 Old Generation";
oldBean = ManagementFactory.newPlatformMXBeanProxy(server, oldId, GarbageCollectorMXBean.class);
if (oldBean == null) {
Log.error("Could not find OldGen Bean");
} else {
oldCount = oldBean.getCollectionCount();
GcInfo lastGcInfo = oldBean.getLastGcInfo();
if (lastGcInfo != null) {
lastOld = lastGcInfo.getStartTime();
} else {
lastOld = 0;
}
}
} catch (Exception e) {
Log.exception(e);
}
}
@Override
public void run() {
processYoung();
processOld();
}
private static synchronized void processOld() {
if (oldBean == null) {
return;
}
GcInfo last = oldBean.getLastGcInfo();
if (last == null) {
return;
}
oldCount = oldBean.getCollectionCount();
lastOld = last.getStartTime();
}
private static synchronized void processYoung() {
if (youngBean == null) {
return;
}
GcInfo last = youngBean.getLastGcInfo();
if (last == null) {
return;
}
long startTime = last.getStartTime();
long endTime = last.getEndTime();
if (startTime == endTime) {
return;
}
if (lastYoung == startTime) {
return;
}
long diff = startTime - lastYoung;
long duration = endTime - startTime;
lastYoung = startTime;
youngInterval.add(diff);
youngDuration.add(duration);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment