1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker package art; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker import java.util.ArrayList; 20*795d594fSAndroid Build Coastguard Worker import java.util.Collections; 21*795d594fSAndroid Build Coastguard Worker import java.util.Random; 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker public class Test906 { run()24*795d594fSAndroid Build Coastguard Worker public static void run() throws Exception { 25*795d594fSAndroid Build Coastguard Worker doTest(); 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker // Number of times we will try to count the heap in various ways. If we are unlucky and end up in 29*795d594fSAndroid Build Coastguard Worker // the middle of a GC we could incorrectly fail. This is expected to be incredibly rare so 10 30*795d594fSAndroid Build Coastguard Worker // retries should be more than sufficient. 31*795d594fSAndroid Build Coastguard Worker private static final int ITERATE_RETRIES = 10; 32*795d594fSAndroid Build Coastguard Worker private static final class Foobar {} 33*795d594fSAndroid Build Coastguard Worker testHeapCount()34*795d594fSAndroid Build Coastguard Worker private static void testHeapCount() throws Exception { 35*795d594fSAndroid Build Coastguard Worker IllegalStateException lastThrow = new IllegalStateException( 36*795d594fSAndroid Build Coastguard Worker "Failed to get consistent counts after " + ITERATE_RETRIES + " retries"); 37*795d594fSAndroid Build Coastguard Worker Foobar[] foobars = new Foobar[123]; 38*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < foobars.length; i++) { 39*795d594fSAndroid Build Coastguard Worker foobars[i] = new Foobar(); 40*795d594fSAndroid Build Coastguard Worker } 41*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ITERATE_RETRIES; i++) { 42*795d594fSAndroid Build Coastguard Worker try { 43*795d594fSAndroid Build Coastguard Worker int all = iterateThroughHeapCount(0, null, Integer.MAX_VALUE); 44*795d594fSAndroid Build Coastguard Worker int tagged = iterateThroughHeapCount(HEAP_FILTER_OUT_UNTAGGED, null, Integer.MAX_VALUE); 45*795d594fSAndroid Build Coastguard Worker int untagged = iterateThroughHeapCount(HEAP_FILTER_OUT_TAGGED, null, Integer.MAX_VALUE); 46*795d594fSAndroid Build Coastguard Worker int taggedClass = iterateThroughHeapCount(HEAP_FILTER_OUT_CLASS_UNTAGGED, null, 47*795d594fSAndroid Build Coastguard Worker Integer.MAX_VALUE); 48*795d594fSAndroid Build Coastguard Worker int untaggedClass = iterateThroughHeapCount(HEAP_FILTER_OUT_CLASS_TAGGED, null, 49*795d594fSAndroid Build Coastguard Worker Integer.MAX_VALUE); 50*795d594fSAndroid Build Coastguard Worker int filteredClass = iterateThroughHeapCount(0, Foobar.class, Integer.MAX_VALUE); 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker if (all != tagged + untagged) { 53*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException("Instances: " + all + " != " + tagged + " + " + untagged); 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker if (all != taggedClass + untaggedClass) { 56*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException("By class: " + all + " != " + taggedClass + " + " + 57*795d594fSAndroid Build Coastguard Worker untaggedClass); 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker if (filteredClass != foobars.length) { 60*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException( 61*795d594fSAndroid Build Coastguard Worker "Missed objects of foobar type. " + filteredClass + " != " + foobars.length); 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker if (tagged != 6) { 64*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException(tagged + " tagged objects"); 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker if (taggedClass != 2) { 67*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException(tagged + " objects with tagged class"); 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker if (all == tagged) { 70*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException("All objects tagged"); 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker if (all == taggedClass) { 73*795d594fSAndroid Build Coastguard Worker throw new IllegalStateException("All objects have tagged class"); 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker // Everything worked! 76*795d594fSAndroid Build Coastguard Worker return; 77*795d594fSAndroid Build Coastguard Worker } catch (IllegalStateException e) { 78*795d594fSAndroid Build Coastguard Worker lastThrow.addSuppressed(e); 79*795d594fSAndroid Build Coastguard Worker } 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker throw lastThrow; 82*795d594fSAndroid Build Coastguard Worker } 83*795d594fSAndroid Build Coastguard Worker GenTs(Class<?> k)84*795d594fSAndroid Build Coastguard Worker private static Object[] GenTs(Class<?> k) throws Exception { 85*795d594fSAndroid Build Coastguard Worker Object[] ret = new Object[new Random().nextInt(100) + 10]; 86*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ret.length; i++) { 87*795d594fSAndroid Build Coastguard Worker ret[i] = k.newInstance(); 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker return ret; 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker checkEq(int a, int b)92*795d594fSAndroid Build Coastguard Worker private static void checkEq(int a, int b) { 93*795d594fSAndroid Build Coastguard Worker if (a != b) { 94*795d594fSAndroid Build Coastguard Worker Error e = new Error("Failed: Expected equal " + a + " and " + b); 95*795d594fSAndroid Build Coastguard Worker System.out.println(e); 96*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 97*795d594fSAndroid Build Coastguard Worker } 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker public static class Foo {} 101*795d594fSAndroid Build Coastguard Worker public static class Bar extends Foo {} 102*795d594fSAndroid Build Coastguard Worker public static class Baz extends Bar {} 103*795d594fSAndroid Build Coastguard Worker public static class Alpha extends Bar {} 104*795d594fSAndroid Build Coastguard Worker public static class MISSING extends Baz {} 105*795d594fSAndroid Build Coastguard Worker public interface Iface {} 106*795d594fSAndroid Build Coastguard Worker public static class Beta implements Iface {} 107*795d594fSAndroid Build Coastguard Worker public static class Gamma implements Iface {} 108*795d594fSAndroid Build Coastguard Worker public static class Delta extends Beta {} testIterateOverInstances()109*795d594fSAndroid Build Coastguard Worker private static void testIterateOverInstances() throws Exception { 110*795d594fSAndroid Build Coastguard Worker Object[] foos = GenTs(Foo.class); 111*795d594fSAndroid Build Coastguard Worker Object[] bars = GenTs(Bar.class); 112*795d594fSAndroid Build Coastguard Worker Object[] bazs = GenTs(Baz.class); 113*795d594fSAndroid Build Coastguard Worker Object[] alphas = GenTs(Alpha.class); 114*795d594fSAndroid Build Coastguard Worker Object[] betas = GenTs(Beta.class); 115*795d594fSAndroid Build Coastguard Worker Object[] gammas = GenTs(Gamma.class); 116*795d594fSAndroid Build Coastguard Worker Object[] deltas = GenTs(Delta.class); 117*795d594fSAndroid Build Coastguard Worker checkEq(0, iterateOverInstancesCount(MISSING.class)); 118*795d594fSAndroid Build Coastguard Worker checkEq(alphas.length, iterateOverInstancesCount(Alpha.class)); 119*795d594fSAndroid Build Coastguard Worker checkEq(bazs.length, iterateOverInstancesCount(Baz.class)); 120*795d594fSAndroid Build Coastguard Worker checkEq(bazs.length + alphas.length + bars.length, iterateOverInstancesCount(Bar.class)); 121*795d594fSAndroid Build Coastguard Worker checkEq(bazs.length + alphas.length + bars.length + foos.length, 122*795d594fSAndroid Build Coastguard Worker iterateOverInstancesCount(Foo.class)); 123*795d594fSAndroid Build Coastguard Worker checkEq(betas.length + gammas.length + deltas.length, 124*795d594fSAndroid Build Coastguard Worker iterateOverInstancesCount(Iface.class)); 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker doTest()127*795d594fSAndroid Build Coastguard Worker public static void doTest() throws Exception { 128*795d594fSAndroid Build Coastguard Worker A a = new A(); 129*795d594fSAndroid Build Coastguard Worker B b = new B(); 130*795d594fSAndroid Build Coastguard Worker B b2 = new B(); 131*795d594fSAndroid Build Coastguard Worker C c = new C(); 132*795d594fSAndroid Build Coastguard Worker A[] aArray = new A[5]; 133*795d594fSAndroid Build Coastguard Worker String s = "Hello World"; 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker setTag(a, 1); 136*795d594fSAndroid Build Coastguard Worker setTag(b, 2); 137*795d594fSAndroid Build Coastguard Worker setTag(b2, 3); 138*795d594fSAndroid Build Coastguard Worker setTag(aArray, 4); 139*795d594fSAndroid Build Coastguard Worker setTag(s, 5); 140*795d594fSAndroid Build Coastguard Worker setTag(B.class, 100); 141*795d594fSAndroid Build Coastguard Worker 142*795d594fSAndroid Build Coastguard Worker testHeapCount(); 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker testIterateOverInstances(); 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker long classTags[] = new long[100]; 147*795d594fSAndroid Build Coastguard Worker long sizes[] = new long[100]; 148*795d594fSAndroid Build Coastguard Worker long tags[] = new long[100]; 149*795d594fSAndroid Build Coastguard Worker int lengths[] = new int[100]; 150*795d594fSAndroid Build Coastguard Worker 151*795d594fSAndroid Build Coastguard Worker int n = iterateThroughHeapData(HEAP_FILTER_OUT_UNTAGGED, null, classTags, sizes, tags, lengths); 152*795d594fSAndroid Build Coastguard Worker System.out.println(sort(n, classTags, sizes, tags, lengths)); 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker iterateThroughHeapAdd(HEAP_FILTER_OUT_UNTAGGED, null); 155*795d594fSAndroid Build Coastguard Worker n = iterateThroughHeapData(HEAP_FILTER_OUT_UNTAGGED, null, classTags, sizes, tags, lengths); 156*795d594fSAndroid Build Coastguard Worker System.out.println(sort(n, classTags, sizes, tags, lengths)); 157*795d594fSAndroid Build Coastguard Worker 158*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapString(getTag(s))); 159*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(s)); 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker boolean[] zArray = new boolean[] { false, true }; 162*795d594fSAndroid Build Coastguard Worker setTag(zArray, 1); 163*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(zArray))); 164*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(zArray)); 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker byte[] bArray = new byte[] { 1, 2, 3 }; 167*795d594fSAndroid Build Coastguard Worker setTag(bArray, 1); 168*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(bArray))); 169*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(bArray)); 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker char[] cArray = new char[] { 'A', 'Z' }; 172*795d594fSAndroid Build Coastguard Worker setTag(cArray, 1); 173*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(cArray))); 174*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(cArray)); 175*795d594fSAndroid Build Coastguard Worker 176*795d594fSAndroid Build Coastguard Worker short[] sArray = new short[] { 1, 2, 3 }; 177*795d594fSAndroid Build Coastguard Worker setTag(sArray, 1); 178*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(sArray))); 179*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(sArray)); 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker int[] iArray = new int[] { 1, 2, 3 }; 182*795d594fSAndroid Build Coastguard Worker setTag(iArray, 1); 183*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(iArray))); 184*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(iArray)); 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker float[] fArray = new float[] { 0.0f, 1.0f }; 187*795d594fSAndroid Build Coastguard Worker setTag(fArray, 1); 188*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(fArray))); 189*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(fArray)); 190*795d594fSAndroid Build Coastguard Worker 191*795d594fSAndroid Build Coastguard Worker long[] lArray = new long[] { 1, 2, 3 }; 192*795d594fSAndroid Build Coastguard Worker setTag(lArray, 1); 193*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(lArray))); 194*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(lArray)); 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker double[] dArray = new double[] { 0.0, 1.0 }; 197*795d594fSAndroid Build Coastguard Worker setTag(dArray, 1); 198*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveArray(getTag(dArray))); 199*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(dArray)); 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker // Force GCs to clean up dirt. 202*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 203*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker doTestPrimitiveFieldsClasses(); 206*795d594fSAndroid Build Coastguard Worker 207*795d594fSAndroid Build Coastguard Worker doTestPrimitiveFieldsIntegral(); 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker // Force GCs to clean up dirt. 210*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 211*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker doTestPrimitiveFieldsFloat(); 214*795d594fSAndroid Build Coastguard Worker 215*795d594fSAndroid Build Coastguard Worker // Force GCs to clean up dirt. 216*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 217*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker doTestPrimitiveFieldsClasses()220*795d594fSAndroid Build Coastguard Worker private static void doTestPrimitiveFieldsClasses() { 221*795d594fSAndroid Build Coastguard Worker System.out.println("doTestPrimitiveFieldsClasses"); 222*795d594fSAndroid Build Coastguard Worker setTag(IntObject.class, 10000); 223*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveFields(10000)); 224*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(IntObject.class)); 225*795d594fSAndroid Build Coastguard Worker setTag(IntObject.class, 0); 226*795d594fSAndroid Build Coastguard Worker 227*795d594fSAndroid Build Coastguard Worker setTag(FloatObject.class, 10000); 228*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveFields(10000)); 229*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(FloatObject.class)); 230*795d594fSAndroid Build Coastguard Worker setTag(FloatObject.class, 0); 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker boolean correctHeapValue = false; 233*795d594fSAndroid Build Coastguard Worker setTag(Inf1.class, 10000); 234*795d594fSAndroid Build Coastguard Worker String heapTrace = iterateThroughHeapPrimitiveFields(10000); 235*795d594fSAndroid Build Coastguard Worker 236*795d594fSAndroid Build Coastguard Worker if (!checkInitialized(Inf1.class)) { 237*795d594fSAndroid Build Coastguard Worker correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000000"); 238*795d594fSAndroid Build Coastguard Worker } else { 239*795d594fSAndroid Build Coastguard Worker correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000001"); 240*795d594fSAndroid Build Coastguard Worker } 241*795d594fSAndroid Build Coastguard Worker 242*795d594fSAndroid Build Coastguard Worker if (!correctHeapValue) 243*795d594fSAndroid Build Coastguard Worker System.out.println("Heap Trace for Inf1 is not as expected:\n" + heapTrace); 244*795d594fSAndroid Build Coastguard Worker 245*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(Inf1.class)); 246*795d594fSAndroid Build Coastguard Worker setTag(Inf1.class, 0); 247*795d594fSAndroid Build Coastguard Worker 248*795d594fSAndroid Build Coastguard Worker setTag(Inf2.class, 10000); 249*795d594fSAndroid Build Coastguard Worker heapTrace = iterateThroughHeapPrimitiveFields(10000); 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker if (!checkInitialized(Inf2.class)) { 252*795d594fSAndroid Build Coastguard Worker correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000000"); 253*795d594fSAndroid Build Coastguard Worker } else { 254*795d594fSAndroid Build Coastguard Worker correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000001"); 255*795d594fSAndroid Build Coastguard Worker } 256*795d594fSAndroid Build Coastguard Worker 257*795d594fSAndroid Build Coastguard Worker if (!correctHeapValue) 258*795d594fSAndroid Build Coastguard Worker System.out.println("Heap Trace for Inf2 is not as expected:\n" + heapTrace); 259*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(Inf2.class)); 260*795d594fSAndroid Build Coastguard Worker 261*795d594fSAndroid Build Coastguard Worker setTag(Inf2.class, 0); 262*795d594fSAndroid Build Coastguard Worker } 263*795d594fSAndroid Build Coastguard Worker doTestPrimitiveFieldsIntegral()264*795d594fSAndroid Build Coastguard Worker private static void doTestPrimitiveFieldsIntegral() { 265*795d594fSAndroid Build Coastguard Worker System.out.println("doTestPrimitiveFieldsIntegral"); 266*795d594fSAndroid Build Coastguard Worker IntObject intObject = new IntObject(); 267*795d594fSAndroid Build Coastguard Worker setTag(intObject, 10000); 268*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveFields(10000)); 269*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(intObject)); 270*795d594fSAndroid Build Coastguard Worker } 271*795d594fSAndroid Build Coastguard Worker doTestPrimitiveFieldsFloat()272*795d594fSAndroid Build Coastguard Worker private static void doTestPrimitiveFieldsFloat() { 273*795d594fSAndroid Build Coastguard Worker System.out.println("doTestPrimitiveFieldsFloat"); 274*795d594fSAndroid Build Coastguard Worker FloatObject floatObject = new FloatObject(); 275*795d594fSAndroid Build Coastguard Worker setTag(floatObject, 10000); 276*795d594fSAndroid Build Coastguard Worker System.out.println(iterateThroughHeapPrimitiveFields(10000)); 277*795d594fSAndroid Build Coastguard Worker System.out.println(getTag(floatObject)); 278*795d594fSAndroid Build Coastguard Worker } 279*795d594fSAndroid Build Coastguard Worker 280*795d594fSAndroid Build Coastguard Worker static class A { 281*795d594fSAndroid Build Coastguard Worker } 282*795d594fSAndroid Build Coastguard Worker 283*795d594fSAndroid Build Coastguard Worker static class B { 284*795d594fSAndroid Build Coastguard Worker } 285*795d594fSAndroid Build Coastguard Worker 286*795d594fSAndroid Build Coastguard Worker static class C { 287*795d594fSAndroid Build Coastguard Worker } 288*795d594fSAndroid Build Coastguard Worker 289*795d594fSAndroid Build Coastguard Worker static class HeapElem implements Comparable<HeapElem> { 290*795d594fSAndroid Build Coastguard Worker long classTag; 291*795d594fSAndroid Build Coastguard Worker long size; 292*795d594fSAndroid Build Coastguard Worker long tag; 293*795d594fSAndroid Build Coastguard Worker int length; 294*795d594fSAndroid Build Coastguard Worker compareTo(HeapElem other)295*795d594fSAndroid Build Coastguard Worker public int compareTo(HeapElem other) { 296*795d594fSAndroid Build Coastguard Worker if (tag != other.tag) { 297*795d594fSAndroid Build Coastguard Worker return Long.compare(tag, other.tag); 298*795d594fSAndroid Build Coastguard Worker } 299*795d594fSAndroid Build Coastguard Worker if (classTag != other.classTag) { 300*795d594fSAndroid Build Coastguard Worker return Long.compare(classTag, other.classTag); 301*795d594fSAndroid Build Coastguard Worker } 302*795d594fSAndroid Build Coastguard Worker if (size != other.size) { 303*795d594fSAndroid Build Coastguard Worker return Long.compare(size, other.size); 304*795d594fSAndroid Build Coastguard Worker } 305*795d594fSAndroid Build Coastguard Worker return Integer.compare(length, other.length); 306*795d594fSAndroid Build Coastguard Worker } 307*795d594fSAndroid Build Coastguard Worker toString()308*795d594fSAndroid Build Coastguard Worker public String toString() { 309*795d594fSAndroid Build Coastguard Worker return "{tag=" + tag + ", class-tag=" + classTag + ", size=" + 310*795d594fSAndroid Build Coastguard Worker (tag >= 100 ? "<class>" : size) // Class size is dependent on 32-bit vs 64-bit, 311*795d594fSAndroid Build Coastguard Worker // so strip it. 312*795d594fSAndroid Build Coastguard Worker + ", length=" + length + "}"; 313*795d594fSAndroid Build Coastguard Worker } 314*795d594fSAndroid Build Coastguard Worker } 315*795d594fSAndroid Build Coastguard Worker sort(int n, long classTags[], long sizes[], long tags[], int lengths[])316*795d594fSAndroid Build Coastguard Worker private static ArrayList<HeapElem> sort(int n, long classTags[], long sizes[], long tags[], 317*795d594fSAndroid Build Coastguard Worker int lengths[]) { 318*795d594fSAndroid Build Coastguard Worker ArrayList<HeapElem> ret = new ArrayList<HeapElem>(n); 319*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; i++) { 320*795d594fSAndroid Build Coastguard Worker HeapElem elem = new HeapElem(); 321*795d594fSAndroid Build Coastguard Worker elem.classTag = classTags[i]; 322*795d594fSAndroid Build Coastguard Worker elem.size = sizes[i]; 323*795d594fSAndroid Build Coastguard Worker elem.tag = tags[i]; 324*795d594fSAndroid Build Coastguard Worker elem.length = lengths[i]; 325*795d594fSAndroid Build Coastguard Worker ret.add(elem); 326*795d594fSAndroid Build Coastguard Worker } 327*795d594fSAndroid Build Coastguard Worker Collections.sort(ret); 328*795d594fSAndroid Build Coastguard Worker return ret; 329*795d594fSAndroid Build Coastguard Worker } 330*795d594fSAndroid Build Coastguard Worker 331*795d594fSAndroid Build Coastguard Worker private static interface Inf1 { 332*795d594fSAndroid Build Coastguard Worker public final static int A = 1; 333*795d594fSAndroid Build Coastguard Worker } 334*795d594fSAndroid Build Coastguard Worker 335*795d594fSAndroid Build Coastguard Worker private static interface Inf2 extends Inf1 { 336*795d594fSAndroid Build Coastguard Worker public final static int B = 1; 337*795d594fSAndroid Build Coastguard Worker } 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker private static class IntObject implements Inf1 { 340*795d594fSAndroid Build Coastguard Worker byte b = (byte)1; 341*795d594fSAndroid Build Coastguard Worker char c= 'a'; 342*795d594fSAndroid Build Coastguard Worker short s = (short)2; 343*795d594fSAndroid Build Coastguard Worker int i = 3; 344*795d594fSAndroid Build Coastguard Worker long l = 4; 345*795d594fSAndroid Build Coastguard Worker Object o = new Object(); 346*795d594fSAndroid Build Coastguard Worker static int sI = 5; 347*795d594fSAndroid Build Coastguard Worker } 348*795d594fSAndroid Build Coastguard Worker 349*795d594fSAndroid Build Coastguard Worker private static class FloatObject extends IntObject implements Inf2 { 350*795d594fSAndroid Build Coastguard Worker float f = 1.23f; 351*795d594fSAndroid Build Coastguard Worker double d = 1.23; 352*795d594fSAndroid Build Coastguard Worker Object p = new Object(); 353*795d594fSAndroid Build Coastguard Worker static int sI = 6; 354*795d594fSAndroid Build Coastguard Worker } 355*795d594fSAndroid Build Coastguard Worker 356*795d594fSAndroid Build Coastguard Worker private final static int HEAP_FILTER_OUT_TAGGED = 0x4; 357*795d594fSAndroid Build Coastguard Worker private final static int HEAP_FILTER_OUT_UNTAGGED = 0x8; 358*795d594fSAndroid Build Coastguard Worker private final static int HEAP_FILTER_OUT_CLASS_TAGGED = 0x10; 359*795d594fSAndroid Build Coastguard Worker private final static int HEAP_FILTER_OUT_CLASS_UNTAGGED = 0x20; 360*795d594fSAndroid Build Coastguard Worker setTag(Object o, long tag)361*795d594fSAndroid Build Coastguard Worker private static void setTag(Object o, long tag) { 362*795d594fSAndroid Build Coastguard Worker Main.setTag(o, tag); 363*795d594fSAndroid Build Coastguard Worker } getTag(Object o)364*795d594fSAndroid Build Coastguard Worker private static long getTag(Object o) { 365*795d594fSAndroid Build Coastguard Worker return Main.getTag(o); 366*795d594fSAndroid Build Coastguard Worker } 367*795d594fSAndroid Build Coastguard Worker iterateOverInstancesCount(Class<?> klass)368*795d594fSAndroid Build Coastguard Worker private static native int iterateOverInstancesCount(Class<?> klass); 369*795d594fSAndroid Build Coastguard Worker checkInitialized(Class<?> klass)370*795d594fSAndroid Build Coastguard Worker private static native boolean checkInitialized(Class<?> klass); iterateThroughHeapCount(int heapFilter, Class<?> klassFilter, int stopAfter)371*795d594fSAndroid Build Coastguard Worker private static native int iterateThroughHeapCount(int heapFilter, 372*795d594fSAndroid Build Coastguard Worker Class<?> klassFilter, int stopAfter); iterateThroughHeapData(int heapFilter, Class<?> klassFilter, long classTags[], long sizes[], long tags[], int lengths[])373*795d594fSAndroid Build Coastguard Worker private static native int iterateThroughHeapData(int heapFilter, 374*795d594fSAndroid Build Coastguard Worker Class<?> klassFilter, long classTags[], long sizes[], long tags[], int lengths[]); iterateThroughHeapAdd(int heapFilter, Class<?> klassFilter)375*795d594fSAndroid Build Coastguard Worker private static native int iterateThroughHeapAdd(int heapFilter, 376*795d594fSAndroid Build Coastguard Worker Class<?> klassFilter); iterateThroughHeapString(long tag)377*795d594fSAndroid Build Coastguard Worker private static native String iterateThroughHeapString(long tag); iterateThroughHeapPrimitiveArray(long tag)378*795d594fSAndroid Build Coastguard Worker private static native String iterateThroughHeapPrimitiveArray(long tag); iterateThroughHeapPrimitiveFields(long tag)379*795d594fSAndroid Build Coastguard Worker private static native String iterateThroughHeapPrimitiveFields(long tag); 380*795d594fSAndroid Build Coastguard Worker } 381