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