summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Richard Uhler <ruhler@google.com> 2015-11-11 09:13:23 -0800
committer Richard Uhler <ruhler@google.com> 2015-11-11 09:13:23 -0800
commit7a16adb4e969e839d2f7ebb985e3c1fc9ec94ab6 (patch)
treee84ddd66ae221931c3cb4d222150ecf55b909fc8
parent54af9bd45a482376b5fe8d4ac291afb5bc950065 (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.txt1
-rw-r--r--tools/ahat/src/AhatHttpHandler.java2
-rw-r--r--tools/ahat/src/AhatSnapshot.java18
-rw-r--r--tools/ahat/src/Main.java2
-rw-r--r--tools/ahat/src/ObjectHandler.java2
-rw-r--r--tools/ahat/src/OverviewHandler.java2
-rw-r--r--tools/ahat/src/RootedHandler.java (renamed from tools/ahat/src/RootsHandler.java)30
-rw-r--r--tools/ahat/src/help.html4
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>