/* * Copyright (C) 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.hit; import java.util.ArrayList; import java.util.HashMap; /* * State is a snapshot of all of the heaps, and related meta-data, for * the runtime at a given instant. * * During parsing of the HPROF file HEAP_DUMP_INFO chunks change which heap * is being referenced. */ public class State { HashMap mHeaps; Heap mCurrentHeap; public State() { mHeaps = new HashMap(); setToDefaultHeap(); } public Heap setToDefaultHeap() { return setHeapTo(0, "default"); } public Heap setHeapTo(int id, String name) { Heap heap = mHeaps.get(id); if (heap == null) { heap = new Heap(name); heap.mState = this; mHeaps.put(id, heap); } mCurrentHeap = heap; return mCurrentHeap; } public Heap getHeap(int id) { return mHeaps.get(id); } public Heap getHeap(String name) { for (Heap heap: mHeaps.values()) { if (heap.mName.equals(name)) { return heap; } } return null; } public final void addStackFrame(StackFrame theFrame) { mCurrentHeap.addStackFrame(theFrame); } public final StackFrame getStackFrame(long id) { return mCurrentHeap.getStackFrame(id); } public final void addStackTrace(StackTrace theTrace) { mCurrentHeap.addStackTrace(theTrace); } public final StackTrace getStackTrace(int traceSerialNumber) { return mCurrentHeap.getStackTrace(traceSerialNumber); } public final StackTrace getStackTraceAtDepth(int traceSerialNumber, int depth) { return mCurrentHeap.getStackTraceAtDepth(traceSerialNumber, depth); } public final void addRoot(RootObj root) { mCurrentHeap.addRoot(root); } public final void addThread(ThreadObj thread, int serialNumber) { mCurrentHeap.addThread(thread, serialNumber); } public final ThreadObj getThread(int serialNumber) { return mCurrentHeap.getThread(serialNumber); } public final void addInstance(long id, Instance instance) { mCurrentHeap.addInstance(id, instance); } public final void addClass(long id, ClassObj theClass) { mCurrentHeap.addClass(id, theClass); } public final Instance findReference(long id) { for (Heap heap: mHeaps.values()) { Instance instance = heap.getInstance(id); if (instance != null) { return instance; } } // Couldn't find an instance of a class, look for a class object return findClass(id); } public final ClassObj findClass(long id) { for (Heap heap: mHeaps.values()) { ClassObj theClass = heap.getClass(id); if (theClass != null) { return theClass; } } return null; } public final ClassObj findClass(String name) { for (Heap heap: mHeaps.values()) { ClassObj theClass = heap.getClass(name); if (theClass != null) { return theClass; } } return null; } public final void dumpInstanceCounts() { for (Heap heap: mHeaps.values()) { System.out.println( "+------------------ instance counts for heap: " + heap.mName); heap.dumpInstanceCounts(); } } public final void dumpSizes() { for (Heap heap: mHeaps.values()) { System.out.println( "+------------------ sizes for heap: " + heap.mName); heap.dumpSizes(); } } public final void dumpSubclasses() { for (Heap heap: mHeaps.values()) { System.out.println( "+------------------ subclasses for heap: " + heap.mName); heap.dumpSubclasses(); } } public final void resolveReferences() { for (Heap heap: mHeaps.values()) { heap.resolveInstanceRefs(this); heap.resolveClassStatics(this); heap.resolveRoots(this); } } }