1b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler/* 2b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Copyright (C) 2015 The Android Open Source Project 3b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 4b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Licensed under the Apache License, Version 2.0 (the "License"); 5b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * you may not use this file except in compliance with the License. 6b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * You may obtain a copy of the License at 7b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 8b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * http://www.apache.org/licenses/LICENSE-2.0 9b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 10b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Unless required by applicable law or agreed to in writing, software 11b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * distributed under the License is distributed on an "AS IS" BASIS, 12b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * See the License for the specific language governing permissions and 14b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * limitations under the License. 15b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler */ 16b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 17b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerpackage com.android.ahat; 18b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 19b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport com.android.tools.perflib.heap.Heap; 20b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.io.IOException; 21b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.io.File; 22b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.util.Collections; 23b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.util.List; 24b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 251af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhlerclass OverviewHandler implements AhatHandler { 261af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler 271af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler private static final String OVERVIEW_ID = "overview"; 281af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler 291af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler private AhatSnapshot mSnapshot; 30b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler private File mHprof; 31b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 32b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public OverviewHandler(AhatSnapshot snapshot, File hprof) { 331af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler mSnapshot = snapshot; 34b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler mHprof = hprof; 35b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 36b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 37b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler @Override 38b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public void handle(Doc doc, Query query) throws IOException { 39b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.title("Overview"); 40b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 41b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.section("General Information"); 42b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.descriptions(); 43b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.description( 44b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler DocString.text("ahat version"), 45c21e4e67861f38e2ebce3cce633d01fcb8de5f1fRichard Uhler DocString.format("ahat-%s", OverviewHandler.class.getPackage().getImplementationVersion())); 46b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.description(DocString.text("hprof file"), DocString.text(mHprof.toString())); 47b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.end(); 48b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 49b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.section("Heap Sizes"); 501af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler printHeapSizes(doc, query); 511a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler 521a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler List<InstanceUtils.NativeAllocation> allocs = mSnapshot.getNativeAllocations(); 531a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler if (!allocs.isEmpty()) { 541a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler doc.section("Registered Native Allocations"); 551a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler long totalSize = 0; 561a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler for (InstanceUtils.NativeAllocation alloc : allocs) { 571a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler totalSize += alloc.size; 581a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler } 591a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler doc.descriptions(); 601a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler doc.description(DocString.text("Number of Registered Native Allocations"), 611a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler DocString.format("%,14d", allocs.size())); 621a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler doc.description(DocString.text("Total Size of Registered Native Allocations"), 631a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler DocString.format("%,14d", totalSize)); 641a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler doc.end(); 651a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler } 661a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler 67a7f46cb9ccc34c3b9af2e3d2ad90c13f89a94829Richard Uhler doc.big(Menu.getMenu()); 68b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 69b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 701af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler private void printHeapSizes(Doc doc, Query query) { 71b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler List<Object> dummy = Collections.singletonList(null); 72b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 73b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler HeapTable.TableConfig<Object> table = new HeapTable.TableConfig<Object>() { 74b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public String getHeapsDescription() { 75b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler return "Bytes Retained by Heap"; 76b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 77b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 78b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public long getSize(Object element, Heap heap) { 79b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler return mSnapshot.getHeapSize(heap); 80b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 81b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 82b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public List<HeapTable.ValueConfig<Object>> getValueConfigs() { 83b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler return Collections.emptyList(); 84b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 85b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler }; 861af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler HeapTable.render(doc, query, OVERVIEW_ID, table, mSnapshot, dummy); 87b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 88b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler} 89b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 90