Delta encode object id.
Bug: 143874090
Change-Id: I4cd0c09cc8b1edca141753272ca85c4413a27a6e
diff --git a/perfetto_hprof/perfetto_hprof.cc b/perfetto_hprof/perfetto_hprof.cc
index d8b03ab..a27fc5c 100644
--- a/perfetto_hprof/perfetto_hprof.cc
+++ b/perfetto_hprof/perfetto_hprof.cc
@@ -719,9 +719,11 @@
std::unique_ptr<protozero::PackedVarInt> reference_object_ids(
new protozero::PackedVarInt);
+ uint64_t prev_object_id = 0;
+
art::Runtime::Current()->GetHeap()->VisitObjectsPaused(
[&writer, &interned_fields, &interned_locations, &reference_field_ids,
- &reference_object_ids, &interned_classes, &ignored_types](
+ &reference_object_ids, &interned_classes, &ignored_types, &prev_object_id](
art::mirror::Object* obj) REQUIRES_SHARED(art::Locks::mutator_lock_) {
if (obj->IsClass()) {
art::mirror::Class* klass = obj->AsClass().Ptr();
@@ -777,9 +779,15 @@
auto class_id = FindOrAppend(&interned_classes, class_ptr);
+ uint64_t object_id = GetObjectId(obj);
perfetto::protos::pbzero::HeapGraphObject* object_proto =
writer.GetHeapGraph()->add_objects();
- object_proto->set_id(GetObjectId(obj));
+ if (prev_object_id && prev_object_id < object_id) {
+ object_proto->set_id_delta(object_id - prev_object_id);
+ } else {
+ object_proto->set_id(object_id);
+ }
+ prev_object_id = object_id;
object_proto->set_type_id(class_id);
// Arrays / strings are magic and have an instance dependent size.