Skip to content

Instantly share code, notes, and snippets.

@stokito
Created June 19, 2018 22:34
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 stokito/a4bc1ddb5f0f966d07a46dbc27c7a558 to your computer and use it in GitHub Desktop.
Save stokito/a4bc1ddb5f0f966d07a46dbc27c7a558 to your computer and use it in GitHub Desktop.
Recover from OutOfmemoryException
package name.stokito.memeater;
import org.apache.derby.iapi.services.memory.LowMemory;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.List;
public class MemoryEater {
private static final int MB = 1048576;
private static List leakHolder = new ArrayList();
private static UncaughtExceptionHandler oomRestorer = new OomRestorer();
private static LowMemory lowMemory = new LowMemory();
public static void main(String[] args) throws InterruptedException {
Thread.setDefaultUncaughtExceptionHandler(oomRestorer);
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("Max JVM memory: " + maxMemory);
System.out.println("Total JVM memory: " + Runtime.getRuntime().totalMemory());
int i;
for (i = 1; ; i++) {
if (lowMemory.isLowMemory()) {
System.out.println("Too low memory, skipping");
i--;
Thread.sleep(500);
continue;
}
try {
byte b[] = new byte[MB];
leakHolder.add(b);
Runtime rt = Runtime.getRuntime();
long freeMemory = rt.freeMemory();
long consumed = Runtime.getRuntime().totalMemory() - freeMemory;
System.out.println("Allocated: " + i + "mb, consumed: " + consumed + " bytes, free memory: " + freeMemory + " bytes i.e. " + (freeMemory / 1024.0 / 1024.0) + "mb");
Thread.sleep(500);
} catch (OutOfMemoryError oom) {
System.out.println("Catching out of memory error");
leakHolder = null;
lowMemory.setLowMemory();
System.out.println("Memory freed, available: " + Runtime.getRuntime().freeMemory());
leakHolder = new ArrayList();
i = 0;
}
}
}
public static class OomRestorer implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
System.out.println("Ololo " + throwable.toString());
leakHolder = null;
System.gc();
}
}
}