blob: 96c944d91d76ccbbb84d7ea585a2df5172933f03 [file] [log] [blame]
/*
* 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<Integer, Heap> mHeaps;
Heap mCurrentHeap;
public State() {
mHeaps = new HashMap<Integer, Heap>();
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);
}
}
}