)]}'
{
  "commit": "f238e686e7d454dbeded397f1d91fab271adec7b",
  "tree": "78bd2d14a3d6610037251be352ba1d04e8ded5cc",
  "parents": [
    "0debe7dc68067fe188b762f40abe43256bdb3d60"
  ],
  "author": {
    "name": "Zimuzo Ezeozue",
    "email": "zezeozue@google.com",
    "time": "Thu Apr 30 00:24:36 2026 +0100"
  },
  "committer": {
    "name": "Zimuzo Ezeozue",
    "email": "zezeozue@google.com",
    "time": "Thu Apr 30 00:54:29 2026 +0100"
  },
  "message": "heap_graph: per-Java-frame root attribution\n\nSurface, for ROOT_JAVA_FRAME GC roots emitted by ART\u0027s perfetto_hprof,\nthe kernel TID of the thread whose stack frame retains each object.\nCombined with the Java thread stack samples ART now emits at heap-\ndump time, this lets a consumer navigate from a heap dominator\nstraight to the holding thread\u0027s call stack with a single\ntrace_processor join.\n\nWire (heap_graph.proto):\n  HeapGraph.frame_roots: repeated HeapGraphFrameRoot\n  HeapGraphFrameRoot { object_id, thread_id (kernel TID) }\n\ntrace_processor:\n  * New nullable column heap_graph_object.root_thread_tid populated\n    from HeapGraphFrameRoot at FinalizeProfile.\n  * Stdlib helper macro propagates root_thread_tid through to\n    _heap_graph_dominator_class_tree.\n  * Public view heap_graph_object exposes root_thread_tid.\n\nUI (dev.perfetto.HeapProfile):\n  * Dominator flamegraph tooltip line \u0027Held By Thread:\n    \u003cthread_name\u003e (tid \u003cN\u003e)\u0027 surfaced only for ROOT_JAVA_FRAME nodes.\n    Resolved via LEFT JOIN thread on the existing thread.tid.\n\nChange-Id: I8568b424835972b3e732543ae8325a54af85f8ea\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "db14581bd62f50c86af6a1c0fe66d9362e07c53e",
      "old_mode": 33188,
      "old_path": "docs/data-sources/java-heap-profiler.md",
      "new_id": "48fd0b4a9ca8bb37542a6317bd086cbffa55bd27",
      "new_mode": 33188,
      "new_path": "docs/data-sources/java-heap-profiler.md"
    },
    {
      "type": "modify",
      "old_id": "0f0e4446966dc4870f7f452b5d098ea1bab8b065",
      "old_mode": 33188,
      "old_path": "protos/perfetto/trace/profiling/heap_graph.proto",
      "new_id": "056fd74e1c95d076cd4a8a9f502a83ed24812e26",
      "new_mode": 33188,
      "new_path": "protos/perfetto/trace/profiling/heap_graph.proto"
    },
    {
      "type": "modify",
      "old_id": "a2f6cb4fefd830fa5d4c9c63f511996cdb1bffa7",
      "old_mode": 33188,
      "old_path": "src/trace_processor/importers/proto/heap_graph_module.cc",
      "new_id": "9153be63908f467d1a745794f821058d8e67691a",
      "new_mode": 33188,
      "new_path": "src/trace_processor/importers/proto/heap_graph_module.cc"
    },
    {
      "type": "modify",
      "old_id": "263d427a0be27cf32c4e66bfacd8c763db534400",
      "old_mode": 33188,
      "old_path": "src/trace_processor/importers/proto/heap_graph_tracker.cc",
      "new_id": "3e1ba180627f242e1dfdb46070e38a761cf3f2bb",
      "new_mode": 33188,
      "new_path": "src/trace_processor/importers/proto/heap_graph_tracker.cc"
    },
    {
      "type": "modify",
      "old_id": "db5fe2443f4ea85cad90fedbee6f2527944eb80e",
      "old_mode": 33188,
      "old_path": "src/trace_processor/importers/proto/heap_graph_tracker.h",
      "new_id": "c5e863628b5d270ae1cfd7517934e981f83a7db9",
      "new_mode": 33188,
      "new_path": "src/trace_processor/importers/proto/heap_graph_tracker.h"
    },
    {
      "type": "modify",
      "old_id": "c516d9635073ba4f46c7c8b433cf86eeb3947003",
      "old_mode": 33188,
      "old_path": "src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/helpers.sql",
      "new_id": "3414d96f0e1614d2277edb61a19eb259d3b11af2",
      "new_mode": 33188,
      "new_path": "src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/helpers.sql"
    },
    {
      "type": "modify",
      "old_id": "b18212ab3bbce79d81f0461e6d65d8d7b24cb309",
      "old_mode": 33188,
      "old_path": "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/memory.sql",
      "new_id": "dd5122ebce67ff551f209b15155c622f444ab642",
      "new_mode": 33188,
      "new_path": "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/memory.sql"
    },
    {
      "type": "modify",
      "old_id": "7402d2168bc19a0188cc7774d10a8c965841a012",
      "old_mode": 33188,
      "old_path": "src/trace_processor/tables/profiler_tables.py",
      "new_id": "f2e6f7c33381ec66d8bcbe4736e58b3e80dcaf0b",
      "new_mode": 33188,
      "new_path": "src/trace_processor/tables/profiler_tables.py"
    },
    {
      "type": "modify",
      "old_id": "648d4a1977dd84227206184f84ec9de99667dc82",
      "old_mode": 33188,
      "old_path": "ui/src/plugins/dev.perfetto.HeapProfile/heap_profile_details_panel.ts",
      "new_id": "99027ac6348bfb2e7f8d534de476a321e2130b21",
      "new_mode": 33188,
      "new_path": "ui/src/plugins/dev.perfetto.HeapProfile/heap_profile_details_panel.ts"
    }
  ]
}
