diff options
Diffstat (limited to 'tools/ahat/src/heapdump/AhatClassObj.java')
-rw-r--r-- | tools/ahat/src/heapdump/AhatClassObj.java | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/tools/ahat/src/heapdump/AhatClassObj.java b/tools/ahat/src/heapdump/AhatClassObj.java new file mode 100644 index 0000000000..c5ade1d405 --- /dev/null +++ b/tools/ahat/src/heapdump/AhatClassObj.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * 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.ahat.heapdump; + +import com.android.tools.perflib.heap.ClassObj; +import com.android.tools.perflib.heap.Field; +import com.android.tools.perflib.heap.Instance; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class AhatClassObj extends AhatInstance { + private String mClassName; + private AhatClassObj mSuperClassObj; + private AhatInstance mClassLoader; + private FieldValue[] mStaticFieldValues; + + public AhatClassObj(long id) { + super(id); + } + + @Override void initialize(AhatSnapshot snapshot, Instance inst) { + super.initialize(snapshot, inst); + + ClassObj classObj = (ClassObj)inst; + mClassName = classObj.getClassName(); + + ClassObj superClassObj = classObj.getSuperClassObj(); + if (superClassObj != null) { + mSuperClassObj = snapshot.findClassObj(superClassObj.getId()); + } + + Instance loader = classObj.getClassLoader(); + if (loader != null) { + mClassLoader = snapshot.findInstance(loader.getId()); + } + + Collection<Map.Entry<Field, Object>> fieldValues = classObj.getStaticFieldValues().entrySet(); + mStaticFieldValues = new FieldValue[fieldValues.size()]; + int index = 0; + for (Map.Entry<Field, Object> field : fieldValues) { + String name = field.getKey().getName(); + String type = field.getKey().getType().toString(); + Value value = snapshot.getValue(field.getValue()); + mStaticFieldValues[index++] = new FieldValue(name, type, value); + + if (field.getValue() instanceof Instance) { + Instance ref = (Instance)field.getValue(); + if (ref.getNextInstanceToGcRoot() == inst) { + value.asAhatInstance().setNextInstanceToGcRoot(this, "." + name); + } + } + } + } + + /** + * Returns the name of the class this is a class object for. + */ + public String getName() { + return mClassName; + } + + /** + * Returns the superclass of this class object. + */ + public AhatClassObj getSuperClassObj() { + return mSuperClassObj; + } + + /** + * Returns the class loader of this class object. + */ + public AhatInstance getClassLoader() { + return mClassLoader; + } + + /** + * Returns the static field values for this class object. + */ + public List<FieldValue> getStaticFieldValues() { + return Arrays.asList(mStaticFieldValues); + } + + @Override public boolean isClassObj() { + return true; + } + + @Override public AhatClassObj asClassObj() { + return this; + } + + @Override public String toString() { + return mClassName; + } + + @Override AhatInstance newPlaceHolderInstance() { + return new AhatPlaceHolderClassObj(this); + } +} + |