From f629cfdbf6da3409aff177352e9ff41209b4570c Mon Sep 17 00:00:00 2001 From: Richard Uhler Date: Mon, 12 Dec 2016 13:11:26 +0000 Subject: ahat: add support for diffing two heap dumps. ahat now has the option to specify a --baseline hprof file to use as the basis for comparing two heap dumps. When a baseline hprof file is provided, ahat will highlight how the heap dump has changed relative to the hprof file. Differences that are highlighted include: * overall heap sizes * total bytes and number of allocations by type * new and deleted instances of a given type * retained sizes of objects * instance fields, static fields, and array elements of modified objects Also: * Remove support for showing NativeAllocations, because I haven't ever found it to be useful, it is not obvious what a "native" allocation is, and I don't feel like adding diff support for them. * Remove help page. Because it is outdated, not well maintained, and not very helpful in the first place. Test: m ahat-test Test: Run in diff mode for tests and added new tests for diff. Test: Manually run with and without diff mode on heap dumps from system server. Bug: 33770653 Change-Id: Id9a392ac75588200e716bbc3edbae6e9cd97c26b --- tools/ahat/src/DocString.java | 73 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) (limited to 'tools/ahat/src/DocString.java') diff --git a/tools/ahat/src/DocString.java b/tools/ahat/src/DocString.java index 19666dea8c..c6303c8c35 100644 --- a/tools/ahat/src/DocString.java +++ b/tools/ahat/src/DocString.java @@ -53,7 +53,6 @@ class DocString { public static DocString link(URI uri, DocString content) { DocString doc = new DocString(); return doc.appendLink(uri, content); - } /** @@ -86,6 +85,78 @@ class DocString { return this; } + /** + * Adorn the given string to indicate it represents something added relative + * to a baseline. + */ + public static DocString added(DocString str) { + DocString string = new DocString(); + string.mStringBuilder.append(""); + string.mStringBuilder.append(str.html()); + string.mStringBuilder.append(""); + return string; + } + + /** + * Adorn the given string to indicate it represents something added relative + * to a baseline. + */ + public static DocString added(String str) { + return added(text(str)); + } + + /** + * Adorn the given string to indicate it represents something removed relative + * to a baseline. + */ + public static DocString removed(DocString str) { + DocString string = new DocString(); + string.mStringBuilder.append(""); + string.mStringBuilder.append(str.html()); + string.mStringBuilder.append(""); + return string; + } + + /** + * Adorn the given string to indicate it represents something removed relative + * to a baseline. + */ + public static DocString removed(String str) { + return removed(text(str)); + } + + /** + * Standard formatted DocString for describing a change in size relative to + * a baseline. + * @param noCurrent - whether no current object exists. + * @param noBaseline - whether no basline object exists. + * @param current - the size of the current object. + * @param baseline - the size of the baseline object. + */ + public static DocString delta(boolean noCurrent, boolean noBaseline, + long current, long baseline) { + DocString doc = new DocString(); + return doc.appendDelta(noCurrent, noBaseline, current, baseline); + } + + /** + * Standard formatted DocString for describing a change in size relative to + * a baseline. + */ + public DocString appendDelta(boolean noCurrent, boolean noBaseline, + long current, long baseline) { + if (noCurrent) { + append(removed(format("%+,14d", 0 - baseline))); + } else if (noBaseline) { + append(added("new")); + } else if (current > baseline) { + append(added(format("%+,14d", current - baseline))); + } else if (current < baseline) { + append(removed(format("%+,14d", current - baseline))); + } + return this; + } + public DocString appendLink(URI uri, DocString content) { mStringBuilder.append("