Skip to content

Instantly share code, notes, and snippets.

@kevinho
Forked from pyricau/OomExceptionHandler.java
Created December 5, 2015 06:45
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 kevinho/6b3479c9d80ca770fcc9 to your computer and use it in GitHub Desktop.
Save kevinho/6b3479c9d80ca770fcc9 to your computer and use it in GitHub Desktop.
Dump the heap on OutOfMemoryError crashes in your debug builds.
import android.content.Context;
import android.os.Debug;
import java.io.File;
public class OomExceptionHandler implements Thread.UncaughtExceptionHandler {
private static final String FILENAME = "out-of-memory.hprof";
public static void install(Context context) {
Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
if (defaultHandler instanceof OomExceptionHandler) {
return;
}
OomExceptionHandler oomHandler = new OomExceptionHandler(defaultHandler, context);
Thread.setDefaultUncaughtExceptionHandler(oomHandler);
}
private final Thread.UncaughtExceptionHandler defaultHandler;
private final Context context;
public OomExceptionHandler(Thread.UncaughtExceptionHandler defaultHandler, Context context) {
this.defaultHandler = defaultHandler;
this.context = context.getApplicationContext();
}
@Override public void uncaughtException(Thread thread, Throwable ex) {
if (containsOom(ex)) {
File heapDumpFile = new File(context.getFilesDir(), FILENAME);
try {
Debug.dumpHprofData(heapDumpFile.getAbsolutePath());
} catch (Throwable ignored) {
}
}
defaultHandler.uncaughtException(thread, ex);
}
private boolean containsOom(Throwable ex) {
if (ex instanceof OutOfMemoryError) {
return true;
}
while ((ex = ex.getCause()) != null) {
if (ex instanceof OutOfMemoryError) {
return true;
}
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment