Skip to content

Instantly share code, notes, and snippets.

@zjyangyong
Forked from pyricau/OomExceptionHandler.java
Last active November 23, 2016 01:31
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 zjyangyong/2af5b8971b1c6d700615b4e9cb6755aa to your computer and use it in GitHub Desktop.
Save zjyangyong/2af5b8971b1c6d700615b4e9cb6755aa 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