Getting an OutOfMemoryError heap dump on Android

Starting with Android 14 (U), perfetto can be configured to collect a heap dump when any Java (ART) process crashes because of a java.lang.OutOfMemoryError.

Steps

You can configure collection using the tools/java_heap_dump tool and passing the --wait-for-oom parameter.

Alternatively, a quick way to do it (without any dependencies except for adb access):

cat << EOF | adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/oome.pftrace buffers: { size_kb: 512288 fill_policy: DISCARD } data_sources: { config { name: "android.java_hprof.oom" java_hprof_config { process_cmdline: "*" } } } data_source_stop_timeout_ms: 100000 trigger_config { trigger_mode: START_TRACING trigger_timeout_ms: 3600000 triggers { name: "com.android.telemetry.art-outofmemory" stop_delay_ms: 500 } } data_sources { config { name: "android.packages_list" } } EOF

This will start a perfetto tracing session for an hour (trigger_timeout_ms) waiting for any runtime instance to hit an OutOfMemoryError. Once an error is captured, tracing will stop:

[862.335] perfetto_cmd.cc:1047 Connected to the Perfetto traced service, TTL: 3601s [871.335] perfetto_cmd.cc:1210 Wrote 19487866 bytes into /data/misc/perfetto-traces/oome.pftrace

You will then be able to download the heap dump by running adb pull /data/misc/perfetto-traces/oome.pftrace.