Java Heap Profiling requires Android 11.
Java Heap Profiling allows you to capture a snapshot of the memory use of objects managed by ART (Android RunTime). This allows to debug situations where a lot of memory is used on the managed heap.
To grab a profile from your device, run the following command, substituting YOUR_APP_NAME with the name of the app you want to profile.
echo 'buffers {
size_kb: 102400
fill_policy: RING_BUFFER
}
data_sources {
config {
name: "android.java_hprof"
java_hprof_config {
process_cmdline: "YOUR_APP_NAME"
}
}
}
duration_ms: 10000
write_into_file: true
' | adb shell perfetto -c - --out /data/misc/perfetto-traces/profile --txt
Then, pull the data onto your machine.
adb pull /data/misc/perfetto-traces/profile some/path
Upload the trace to the Perfetto UI and click on diamond marker that shows.
This will present a flamegraph of the memory attributed to the shortest path to a garbage-collection root. In general an object is reachable by many paths, we only show the shortest as that reduces the complexity of the data displayed and is generally the highest-signal.
We aggregate the paths per class name, so if there are two Foo objects that each retain a String, we will show one element for String as a child of one Foo.