Skip to content

Instantly share code, notes, and snippets.

@buchgr
Created September 1, 2015 19:54
Show Gist options
  • Select an option

  • Save buchgr/e3884e330a49b8606b8e to your computer and use it in GitHub Desktop.

Select an option

Save buchgr/e3884e330a49b8606b8e to your computer and use it in GitHub Desktop.
import com.sun.management.GcInfo;
import javax.management.MBeanServer;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import com.sun.management.GarbageCollectorMXBean;
import java.lang.management.MemoryUsage;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Executors;
import static java.util.concurrent.TimeUnit.SECONDS;
class GarbageCollectorInfo {
static final String YGEN_COLLECTOR_NAME = "java.lang:type=GarbageCollector,name=ParNew";
static final String OGEN_COLLECTOR_NAME = "java.lang:type=GarbageCollector,name=ConcurrentMarkSweep";
static final GarbageCollectorMXBean ygenMBean;
static final GarbageCollectorMXBean ogenMBean;
static {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
GarbageCollectorMXBean mBean = null;
try {
mBean = ManagementFactory.newPlatformMXBeanProxy(server, YGEN_COLLECTOR_NAME, GarbageCollectorMXBean.class);
} catch (IOException e) {
e.printStackTrace();
}
ygenMBean = mBean;
try {
mBean = ManagementFactory.newPlatformMXBeanProxy(server, OGEN_COLLECTOR_NAME, GarbageCollectorMXBean.class);
} catch (IOException e) {
e.printStackTrace();
}
ogenMBean = mBean;
}
private long lastYGId;
private long lastOGId;
public void printYGenCollectionStats() {
lastYGId = printCollectionStats(ygenMBean, lastYGId, false);
}
public void printOGenCollectionStats() {
lastOGId = printCollectionStats(ogenMBean, lastOGId, true);
}
private static long printCollectionStats(GarbageCollectorMXBean mBean, Long lastId, boolean isOldGen) {
GcInfo info = mBean.getLastGcInfo();
if (info == null) {
return lastId;
}
long id = info.getId();
if (id == lastId) {
return lastId;
}
long start = info.getStartTime();
long end = info.getEndTime();
if (start == end) {
return lastId;
}
System.out.printf("Duration of '%s' collection %d was %d ms.\n", mBean.getName(), id, end - start);
Map<String, MemoryUsage> before = info.getMemoryUsageBeforeGc();
Map<String, MemoryUsage> after = info.getMemoryUsageAfterGc();
MemoryUsage survivorBefore = before.get("Par Survivor Space");
MemoryUsage edenBefore = before.get("Par Eden Space");
MemoryUsage oldGenBefore = before.get("CMS Old Gen");
MemoryUsage survivorAfter = after.get("Par Survivor Space");
MemoryUsage edenAfter = after.get("Par Eden Space");
MemoryUsage oldGenAfter = after.get("CMS Old Gen");
long deltaSize = isOldGen ? oldGenBefore.getUsed() - oldGenAfter.getUsed()
: edenBefore.getUsed() - edenAfter.getUsed();
deltaSize /= 1024 * 1024;
System.out.printf("Cleaned up a total of %d MB.\n", deltaSize);
return id;
}
}
public class Main {
static {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
GarbageCollectorInfo info = new GarbageCollectorInfo();
@Override
public void run() {
info.printYGenCollectionStats();
info.printOGenCollectionStats();
}
}, 0, 1, SECONDS);
}
public static void main(String[] args) throws InterruptedException {
byte[][] bytes = new byte[51200][];
Random rand = new Random();
for (long i = 0; i < 100000000000l; i++) {
byte[] bytes0 = new byte[1024];
rand.nextBytes(bytes0);
bytes[(int) (i % bytes.length)] = bytes0;
}
System.out.println("done" + bytes.length);
}
}
@buchgr
Copy link
Author

buchgr commented Sep 1, 2015

Example output:

/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -XX:+UseConcMarkSweepGC -Xms200m -Xmx200m -XX:NewSize=50m -XX:MaxNewSize=50m -Didea.launcher.port=7536 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 14 CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/jakobbuchgraber/Code/beantest/out/production/bean:/Applications/IntelliJ IDEA 14 CE.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain Main
Duration of 'ParNew' collection 4 was 17 ms.
Cleaned up a total of 40 MB.
Duration of 'ConcurrentMarkSweep' collection 2 was 17 ms.
Cleaned up a total of 36 MB.
Duration of 'ParNew' collection 11 was 13 ms.
Cleaned up a total of 40 MB.
Duration of 'ConcurrentMarkSweep' collection 8 was 120 ms.
Cleaned up a total of 34 MB.
Duration of 'ParNew' collection 17 was 14 ms.
Cleaned up a total of 40 MB.
Duration of 'ConcurrentMarkSweep' collection 15 was 123 ms.
Cleaned up a total of 35 MB.
...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment