de.sandec.jmemorybuddy.JMemoryBuddy Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JMemoryBuddy Show documentation
Show all versions of JMemoryBuddy Show documentation
A library usefull for unit testing memory leaks
package de.sandec.jmemorybuddy;
import com.sun.management.HotSpotDiagnosticMXBean;
import javax.management.MBeanServer;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.function.Consumer;
import java.util.function.Function;
public class JMemoryBuddy {
static int steps = 10;
static int overallTime = 1000;
static int sleepTime = overallTime / steps;
static boolean createHeapdump = true;
static int garbageAmount = 999999;
private static String MX_BEAN_PROXY_TYPE = "com.sun.management:type=HotSpotDiagnostic";
static String outputFolderString = ".";
static {
outputFolderString = System.getProperty("jmemorybuddy.output",".");
overallTime = Integer.parseInt(System.getProperty("jmemorybuddy.checktime","1000"));
steps = Integer.parseInt(System.getProperty("jmemorybuddy.steps", "10"));
createHeapdump = Boolean.parseBoolean(System.getProperty("jmemorybuddy.createHeapdump", "true"));
garbageAmount = Integer.parseInt(System.getProperty("jmemorybuddy.garbageAmount", "10"));
}
public static void createGarbage() {
LinkedList list = new LinkedList();
int counter = 0;
while(counter < garbageAmount) {
counter += 1;
list.add(1);
}
}
public static void assertCollectable(WeakReference weakReference) {
if(!checkCollectable(weakReference)) {
AssertCollectable assertCollectable = new AssertCollectable(weakReference);
createHeapDump();
throw new AssertionError("Content of WeakReference was not collected. content: " + weakReference.get());
}
}
public static boolean checkCollectable(WeakReference weakReference) {
return checkCollectable(steps, weakReference) > 0;
}
private static int checkCollectable(int stepsLeft, WeakReference weakReference) {
int counter = stepsLeft;
if(weakReference.get() != null) {
createGarbage();
System.gc();
System.runFinalization();
}
while(counter > 0 && weakReference.get() != null) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {}
counter = counter - 1;
createGarbage();
System.gc();
System.runFinalization();
}
if(weakReference.get() == null && counter < steps / 3) {
int percentageUsed = (int) ((steps - counter) / steps * 100);
System.out.println("Warning test seems to be unstable. time used: " + percentageUsed + "%");
}
return counter;
}
public static void assertNotCollectable(WeakReference weakReference) {
if(!checkNotCollectable(weakReference)) {
throw new AssertionError("Content of WeakReference was collected!");
}
}
public static boolean checkNotCollectable(WeakReference weakReference) {
createGarbage();
System.gc();
return weakReference.get() != null;
}
public static void memoryTest(Consumer f) {
LinkedList toBeCollected = new LinkedList();
LinkedList toBeNotCollected = new LinkedList();
LinkedList toBeReferenced = new LinkedList();
f.accept(new MemoryTestAPI() {
public void assertCollectable(Object ref) {
if(ref == null) throw new NullPointerException();
toBeCollected.add(new WeakReference