diff options
author | 2015-11-11 09:13:23 -0800 | |
---|---|---|
committer | 2015-11-11 09:13:23 -0800 | |
commit | 7a16adb4e969e839d2f7ebb985e3c1fc9ec94ab6 (patch) | |
tree | e84ddd66ae221931c3cb4d222150ecf55b909fc8 | |
parent | 54af9bd45a482376b5fe8d4ac291afb5bc950065 (diff) |
Change roots view to "rooted".
Instead of just showing roots in the roots view, show all objects
whose immediate dominator is the SENTINEL_ROOT.
Bug: 24613815
Change-Id: I96429d75395edfe109222e88d31cdc0bd87a7767
-rw-r--r-- | tools/ahat/README.txt | 1 | ||||
-rw-r--r-- | tools/ahat/src/AhatHttpHandler.java | 2 | ||||
-rw-r--r-- | tools/ahat/src/AhatSnapshot.java | 18 | ||||
-rw-r--r-- | tools/ahat/src/Main.java | 2 | ||||
-rw-r--r-- | tools/ahat/src/ObjectHandler.java | 2 | ||||
-rw-r--r-- | tools/ahat/src/OverviewHandler.java | 2 | ||||
-rw-r--r-- | tools/ahat/src/RootedHandler.java (renamed from tools/ahat/src/RootsHandler.java) | 30 | ||||
-rw-r--r-- | tools/ahat/src/help.html | 4 |
8 files changed, 25 insertions, 36 deletions
diff --git a/tools/ahat/README.txt b/tools/ahat/README.txt index aa548cca55..362ae2536f 100644 --- a/tools/ahat/README.txt +++ b/tools/ahat/README.txt @@ -14,7 +14,6 @@ TODO: - Say how to enable allocation sites. - Where to submit feedback, questions, and bug reports. * Dim 'image' and 'zygote' heap sizes slightly? Why do we even show these? - * Filter out RootObjs in mSnapshot.getGCRoots, not RootsHandler. * Let user re-sort sites objects info by clicking column headers. * Let user re-sort "Objects" list. * Show site context and heap and class filter in "Objects" view? diff --git a/tools/ahat/src/AhatHttpHandler.java b/tools/ahat/src/AhatHttpHandler.java index 0553713702..178747c29a 100644 --- a/tools/ahat/src/AhatHttpHandler.java +++ b/tools/ahat/src/AhatHttpHandler.java @@ -44,7 +44,7 @@ class AhatHttpHandler implements HttpHandler { DocString menu = new DocString(); menu.appendLink(DocString.uri("/"), DocString.text("overview")); menu.append(" - "); - menu.appendLink(DocString.uri("roots"), DocString.text("roots")); + menu.appendLink(DocString.uri("rooted"), DocString.text("rooted")); menu.append(" - "); menu.appendLink(DocString.uri("sites"), DocString.text("allocations")); menu.append(" - "); diff --git a/tools/ahat/src/AhatSnapshot.java b/tools/ahat/src/AhatSnapshot.java index 43658f33ef..0bf064eb24 100644 --- a/tools/ahat/src/AhatSnapshot.java +++ b/tools/ahat/src/AhatSnapshot.java @@ -19,7 +19,6 @@ package com.android.ahat; import com.android.tools.perflib.heap.ClassObj; import com.android.tools.perflib.heap.Heap; import com.android.tools.perflib.heap.Instance; -import com.android.tools.perflib.heap.RootObj; import com.android.tools.perflib.heap.Snapshot; import com.android.tools.perflib.heap.StackFrame; import com.android.tools.perflib.heap.StackTrace; @@ -30,7 +29,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -47,6 +45,9 @@ class AhatSnapshot { // Map from Instance to the list of Instances it immediately dominates. private Map<Instance, List<Instance>> mDominated; + // Collection of objects whose immediate dominator is the SENTINEL_ROOT. + private List<Instance> mRooted; + private Site mRootSite; private Map<Heap, Long> mHeapSizes; @@ -70,6 +71,7 @@ class AhatSnapshot { mDominated = new HashMap<Instance, List<Instance>>(); mRootSite = new Site("ROOT"); mHeapSizes = new HashMap<Heap, Long>(); + mRooted = new ArrayList<Instance>(); ClassObj javaLangClass = mSnapshot.findClass("java.lang.Class"); for (Heap heap : mHeaps) { @@ -79,6 +81,10 @@ class AhatSnapshot { if (dominator != null) { total += inst.getSize(); + if (dominator == Snapshot.SENTINEL_ROOT) { + mRooted.add(inst); + } + // Properly label the class of a class object. if (inst instanceof ClassObj && javaLangClass != null && inst.getClassObj() == null) { inst.setClassId(javaLangClass.getId()); @@ -126,8 +132,12 @@ class AhatSnapshot { return mSnapshot.getHeap(name); } - public Collection<RootObj> getGCRoots() { - return mSnapshot.getGCRoots(); + /** + * Returns a collection of instances whose immediate dominator is the + * SENTINEL_ROOT. + */ + public List<Instance> getRooted() { + return mRooted; } public List<Heap> getHeaps() { diff --git a/tools/ahat/src/Main.java b/tools/ahat/src/Main.java index 96fc53b6bd..ebd49d7e2c 100644 --- a/tools/ahat/src/Main.java +++ b/tools/ahat/src/Main.java @@ -74,7 +74,7 @@ public class Main { InetSocketAddress addr = new InetSocketAddress(loopback, port); HttpServer server = HttpServer.create(addr, 0); server.createContext("/", new AhatHttpHandler(new OverviewHandler(ahat, hprof))); - server.createContext("/roots", new AhatHttpHandler(new RootsHandler(ahat))); + server.createContext("/rooted", new AhatHttpHandler(new RootedHandler(ahat))); server.createContext("/object", new AhatHttpHandler(new ObjectHandler(ahat))); server.createContext("/objects", new AhatHttpHandler(new ObjectsHandler(ahat))); server.createContext("/site", new AhatHttpHandler(new SiteHandler(ahat))); diff --git a/tools/ahat/src/ObjectHandler.java b/tools/ahat/src/ObjectHandler.java index 9e4ce563d5..1305070b0f 100644 --- a/tools/ahat/src/ObjectHandler.java +++ b/tools/ahat/src/ObjectHandler.java @@ -215,7 +215,7 @@ class ObjectHandler implements AhatHandler { public DocString render(Instance element) { if (element == null) { - return DocString.link(DocString.uri("roots"), DocString.text("ROOT")); + return DocString.link(DocString.uri("rooted"), DocString.text("ROOT")); } else { return DocString.text("→ ").append(Value.render(element)); } diff --git a/tools/ahat/src/OverviewHandler.java b/tools/ahat/src/OverviewHandler.java index e86679f378..0fe4fba716 100644 --- a/tools/ahat/src/OverviewHandler.java +++ b/tools/ahat/src/OverviewHandler.java @@ -50,7 +50,7 @@ class OverviewHandler implements AhatHandler { printHeapSizes(doc, query); DocString menu = new DocString(); - menu.appendLink(DocString.uri("roots"), DocString.text("Roots")); + menu.appendLink(DocString.uri("rooted"), DocString.text("Rooted")); menu.append(" - "); menu.appendLink(DocString.uri("site"), DocString.text("Allocations")); menu.append(" - "); diff --git a/tools/ahat/src/RootsHandler.java b/tools/ahat/src/RootedHandler.java index 2a92c90c4e..ec3272fa92 100644 --- a/tools/ahat/src/RootsHandler.java +++ b/tools/ahat/src/RootedHandler.java @@ -16,41 +16,21 @@ package com.android.ahat; -import com.android.tools.perflib.heap.Instance; -import com.android.tools.perflib.heap.RootObj; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -class RootsHandler implements AhatHandler { +class RootedHandler implements AhatHandler { - private static final String ROOTS_ID = "roots"; + private static final String ROOTED_ID = "rooted"; private AhatSnapshot mSnapshot; - public RootsHandler(AhatSnapshot snapshot) { + public RootedHandler(AhatSnapshot snapshot) { mSnapshot = snapshot; } @Override public void handle(Doc doc, Query query) throws IOException { - doc.title("Roots"); - - Set<Instance> rootset = new HashSet<Instance>(); - for (RootObj root : mSnapshot.getGCRoots()) { - Instance inst = root.getReferredInstance(); - if (inst != null) { - rootset.add(inst); - } - } - - List<Instance> roots = new ArrayList<Instance>(); - for (Instance inst : rootset) { - roots.add(inst); - } - DominatedList.render(mSnapshot, doc, query, ROOTS_ID, roots); + doc.title("Rooted"); + DominatedList.render(mSnapshot, doc, query, ROOTED_ID, mSnapshot.getRooted()); } } - diff --git a/tools/ahat/src/help.html b/tools/ahat/src/help.html index b7ae2ceb43..92ec37d984 100644 --- a/tools/ahat/src/help.html +++ b/tools/ahat/src/help.html @@ -20,7 +20,7 @@ limitations under the License. <div class="menu"> <a href="/">overview</a> - - <a href="roots">roots</a> - + <a href="rooted">rooted</a> - <a href="sites">allocations</a> - <a href="help">help</a> </div> @@ -29,7 +29,7 @@ limitations under the License. <h2>Information shown by ahat:</h2> <ul> <li><a href="/">The total bytes retained by heap.</a></li> - <li><a href="/roots">A list of root objects and their retained sizes for each heap.</a></li> + <li><a href="/rooted">A list of rooted objects and their retained sizes for each heap.</a></li> <li>Information about each allocated object: <ul> <li>The allocation site (stack trace) of the object (if available).</li> |