package org.gridkit.jvmtool.gcflow;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.junit.Test;
public class SelfReporterTest {
private List<GcAdapter> adapters = new ArrayList<GcAdapter>();
public void run(int seconds) {
long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(seconds);
while(System.currentTimeMillis() < deadline) {
for(GcAdapter a: adapters) {
a.report();
}
long nextRep = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(50);
while(System.nanoTime() < nextRep) {
Random rnd = new Random();
List<String> garbage = new ArrayList<String>();
for(int i = 0; i != 10000; ++i) {
int n = rnd.nextInt(512) + 128;
StringBuilder sb = new StringBuilder();
for(int j = 0; j != n; ++j) {
sb.append(rnd.nextInt());
}
garbage.add(sb.toString());
}
}
LockSupport.parkNanos(1);
}
}
public void addToAll(GarbageCollectionSampler sampler) throws MalformedObjectNameException, IOException {
for(ObjectName gc: ManagementFactory.getPlatformMBeanServer().queryNames(GcKnowledgeBase.COLLECTORS_PATTERN, null)) {
GcAdapter a = new GcAdapter(ManagementFactory.getPlatformMBeanServer(), gc, sampler);
adapters.add(a);
}
}
@Test
public void simple_report() throws MalformedObjectNameException, IOException {
addToAll(new SimpleReporter());
run(20);
}
private final class SimpleReporter implements GarbageCollectionSampler {
@Override
public void report(String algoName, int eventsMissed, GcReport info) {
if (eventsMissed > 0) {
System.out.println("Missed " + eventsMissed + " events for [" + algoName + "]");
}
StringBuilder sb = new StringBuilder();
sb.append("[" + algoName + "] #" + info.getId()).append(' ');
reportSize(info, sb, info.getAllMemoryPools());
sb.append('\n');
sb.append(" ");
Collection<String> eden = info.getEdenPools();
Collection<String> surv = info.getSurvivourPools();
Collection<String> old = info.getOldSpacePools();
Collection<String> perm = info.getPermSpacePools();
if (!eden.isEmpty()) {
sb.append("EDEN[");
reportSize(info, sb, eden);
sb.append("] ");
}
if (!surv.isEmpty()) {
sb.append("SURVIVOUR[");
reportSize(info, sb, surv);
sb.append("] ");
}
if (!old.isEmpty()) {
sb.append("OLD[");
reportSize(info, sb, old);
sb.append("] ");
}
if (!perm.isEmpty() && info.getSizeBefore(perm) != info.getSizeAfter(perm)) {
sb.append("PERM[");
reportSize(info, sb, perm);
sb.append("] ");
}
sb.append('\n');
System.out.print(sb);
}
public void reportSize(GcReport info, StringBuilder sb, Collection<String> pools) {
long delta = info.getSizeAfter(pools) - info.getSizeBefore(pools);
sb.append(FormatHelper.toMemoryUnits(info.getSizeBefore(pools))).append('B');
if (delta != 0) {
sb.append("->")
.append(FormatHelper.toMemoryUnits(info.getSizeAfter(pools))).append('B');
if (delta < 0) {
sb.append(" -").append(FormatHelper.toMemoryUnits(-delta)).append('B');
}
else if (delta > 0){
sb.append(" +").append(FormatHelper.toMemoryUnits(delta)).append('B');
}
}
}
}
}