/* * 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.HashSet; import java.util.Set; public abstract class Instance { long mId; // Id of the ClassObj of which this object is an instance long mClassId; // The stack in which this object was allocated StackTrace mStack; // The heap in which this object was allocated (app, zygote, etc) Heap mHeap; // The size of this object int mSize; public interface Filter { public boolean accept(Instance instance); } // List of all objects that hold a live reference to this object private ArrayList mParents; /* * After the whole HPROF file is read and parsed this method will be * called on all heap objects so that they can resolve their internal * object references. * * The super-State is passed in because some object references (such * as interned Strings and static class fields) may need to be searched * for in a heap other than the one this Instance is in. */ public abstract void resolveReferences(State state); /* * Some operations require gathering all the objects in a given section * of the object graph. If non-null, the filter is applied to each * node in the graph to determine if it should be added to the result * set. */ public abstract void visit(Set resultSet, Filter filter); public void setSize(int size) { mSize = size; } public final int getCompositeSize() { HashSet set = new HashSet(); visit(set, null); int size = 0; for (Instance instance: set) { size += instance.getSize(); } return size; } // Returns the instrinsic size of a given object public int getSize() { return mSize; } public abstract String getTypeName(); public void setHeap(Heap heap) { mHeap = heap; } // Add to the list of objects that have a hard reference to this Instance public void addParent(Instance parent) { if (mParents == null) { mParents = new ArrayList(); } mParents.add(parent); } public ArrayList getParents() { if (mParents == null) { mParents = new ArrayList(); } return mParents; } /* * If this object has a reference to the object identified by id, return * a String describing the reference in detail. */ public String describeReferenceTo(long id) { return "No reference to 0x" + Long.toHexString(id); } }