Correct dominator tree exclusion criteria
We should only exclude referent edges for all Reference types
Bug: 337060698
Change-Id: I6bbd2085899089baf8e45cf904f2316139cfe0c8
diff --git a/src/trace_processor/perfetto_sql/stdlib/memory/heap_graph_dominator_tree.sql b/src/trace_processor/perfetto_sql/stdlib/memory/heap_graph_dominator_tree.sql
index 28edf7f..f0cfae1 100644
--- a/src/trace_processor/perfetto_sql/stdlib/memory/heap_graph_dominator_tree.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/memory/heap_graph_dominator_tree.sql
@@ -18,20 +18,21 @@
-- Excluding following types from the graph as they share objects' ownership
-- with their real (more interesting) owners and will mask their idom to be the
-- "super root".
-CREATE PERFETTO TABLE _excluded_type_ids AS
-WITH RECURSIVE class_visitor(type_id) AS (
- SELECT id AS type_id
- FROM heap_graph_class
- WHERE name IN (
- 'java.lang.ref.PhantomReference',
- 'java.lang.ref.FinalizerReference'
- )
- UNION ALL
- SELECT child.id AS type_id
- FROM heap_graph_class child
- JOIN class_visitor parent ON parent.type_id = child.superclass_id
-)
-SELECT * FROM class_visitor;
+CREATE PERFETTO TABLE _ref_type_ids AS
+SELECT id AS type_id FROM heap_graph_class
+WHERE kind IN (
+ 'KIND_FINALIZER_REFERENCE',
+ 'KIND_PHANTOM_REFERENCE',
+ 'KIND_SOFT_REFERENCE',
+ 'KIND_WEAK_REFERENCE');
+
+CREATE PERFETTO TABLE _excluded_refs AS
+SELECT ref.id
+ FROM _ref_type_ids
+ JOIN heap_graph_object robj USING (type_id)
+ JOIN heap_graph_reference ref USING (reference_set_id)
+WHERE ref.field_name = 'java.lang.ref.Reference.referent'
+ORDER BY ref.id;
-- The assigned id of the "super root".
-- Since a Java heap graph is a "forest" structure, we need to add a imaginary
@@ -48,7 +49,8 @@
ref.owned_id AS dest_node_id
FROM heap_graph_reference ref
JOIN heap_graph_object source_node ON ref.owner_id = source_node.id
-WHERE source_node.reachable AND source_node.type_id NOT IN _excluded_type_ids
+WHERE source_node.reachable
+ AND ref.id NOT IN _excluded_refs
AND ref.owned_id IS NOT NULL
UNION ALL
SELECT
diff --git a/test/trace_processor/diff_tests/stdlib/memory/heap_graph_dominator_tree_tests.py b/test/trace_processor/diff_tests/stdlib/memory/heap_graph_dominator_tree_tests.py
index 52bb465..0aa0f64 100644
--- a/test/trace_processor/diff_tests/stdlib/memory/heap_graph_dominator_tree_tests.py
+++ b/test/trace_processor/diff_tests/stdlib/memory/heap_graph_dominator_tree_tests.py
@@ -65,7 +65,7 @@
19,14,1,128,4,"U"
20,14,1,256,4,"V"
21,14,1,512,4,"W"
- 23,25,1,1024,1,"java.lang.ref.FinalizerReference"
+ 23,25,1,1024,1,"sun.misc.Cleaner"
"""))
def test_heap_graph_super_root_fn(self):
diff --git a/test/trace_processor/diff_tests/stdlib/memory/heap_graph_for_dominator_tree.textproto b/test/trace_processor/diff_tests/stdlib/memory/heap_graph_for_dominator_tree.textproto
index b0de072..940b38f 100644
--- a/test/trace_processor/diff_tests/stdlib/memory/heap_graph_for_dominator_tree.textproto
+++ b/test/trace_processor/diff_tests/stdlib/memory/heap_graph_for_dominator_tree.textproto
@@ -26,7 +26,7 @@
# 2. a synthetic tree whose dominator tree is itself. It's drawn below with
# each object represented by it's class name. Number in the bracket is the
# size of each node in bytes.
- # S[1] java.lang.ref.FinalizerReference[1024]
+ # S[1] sun.misc.Cleaner[1024]
# / \ /
# M[2] N[4]
# / \ / \
@@ -191,7 +191,7 @@
}
objects {
id: 0x18
- type_id: 24 # "java.lang.ref.FinalizerReference"
+ type_id: 24 # "sun.misc.Cleaner"
self_size: 1024
reference_object_id: 0x0e
}
@@ -335,9 +335,15 @@
}
types {
id: 24
- class_name: "java.lang.ref.FinalizerReference"
+ class_name: "sun.misc.Cleaner"
+ kind: KIND_PHANTOM_REFERENCE
+ reference_field_id: 123
location_id: 1
}
+ field_names {
+ iid: 123
+ str: "java.lang.ref.Reference.referent"
+ }
continued: false
index: 1
}