Skip to content

Instantly share code, notes, and snippets.

@pyricau
Created May 6, 2015 17:18
Show Gist options
  • Save pyricau/4726389fd64f3b7c6f32 to your computer and use it in GitHub Desktop.
Save pyricau/4726389fd64f3b7c6f32 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;
}
}
@gordonpro
Copy link

A good manner.

@xxxzhi
Copy link

xxxzhi commented Sep 4, 2015

Nice

@fyhack
Copy link

fyhack commented Dec 16, 2015

+1

@wonghoman
Copy link

Thanks for share.

@chenshengfa0803
Copy link

Thanks

@yadav-rahul
Copy link

+1

@Ankur008
Copy link

Ankur008 commented Feb 1, 2017

hey can anyone explain me how to use this code. As I am facing OOM error continuously (reported by leaks canary lib). How to use above code to dump file. I think FILENAME means heap dump file name, how can I get it, where it is stored. I will get it using Leaks app after clicking on OOM error. But how will I get it from my app.

@MagicMashRoom
Copy link

ths good code

@mobileappconsultant
Copy link

Try OomExceptionHandler.install(yourContext);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment