13524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler/* 23524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * Copyright (C) 2015 The Android Open Source Project 33524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * 43524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * Licensed under the Apache License, Version 2.0 (the "License"); 53524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * you may not use this file except in compliance with the License. 63524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * You may obtain a copy of the License at 73524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * 83524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * http://www.apache.org/licenses/LICENSE-2.0 93524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * 103524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * Unless required by applicable law or agreed to in writing, software 113524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * distributed under the License is distributed on an "AS IS" BASIS, 123524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * See the License for the specific language governing permissions and 143524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * limitations under the License. 153524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler */ 163524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler 173524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhlerimport dalvik.system.VMDebug; 183524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhlerimport java.io.IOException; 19b357730dd691e608f8a3d155330ab3763ce912cfRichard Uhlerimport java.lang.ref.PhantomReference; 20b357730dd691e608f8a3d155330ab3763ce912cfRichard Uhlerimport java.lang.ref.ReferenceQueue; 21b357730dd691e608f8a3d155330ab3763ce912cfRichard Uhlerimport java.lang.ref.WeakReference; 221a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhlerimport libcore.util.NativeAllocationRegistry; 233524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler 243524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler/** 253524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler * Program used to create a heap dump for test purposes. 263524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler */ 273524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhlerpublic class Main { 283524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // Keep a reference to the DumpedStuff instance so that it is not garbage 293524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // collected before we take the heap dump. 303524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler public static DumpedStuff stuff; 313524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler 323524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // We will take a heap dump that includes a single instance of this 333524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // DumpedStuff class. Objects stored as fields in this class can be easily 343524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // found in the hprof dump by searching for the instance of the DumpedStuff 353524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // class and reading the desired field. 363524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler public static class DumpedStuff { 373524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler public String basicString = "hello, world"; 38c7f7712a3808b8e3046eae8a4dbb7f6a7fc6faf2Richard Uhler public char[] charArray = "char thing".toCharArray(); 393524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler public String nullString = null; 403524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler public Object anObject = new Object(); 41b357730dd691e608f8a3d155330ab3763ce912cfRichard Uhler public ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>(); 42b357730dd691e608f8a3d155330ab3763ce912cfRichard Uhler public PhantomReference aPhantomReference = new PhantomReference(anObject, referenceQueue); 43b357730dd691e608f8a3d155330ab3763ce912cfRichard Uhler public WeakReference aWeakReference = new WeakReference(anObject, referenceQueue); 441af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler public byte[] bigArray; 451af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler 461af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler DumpedStuff() { 471af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler int N = 1000000; 481af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler bigArray = new byte[N]; 491af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler for (int i = 0; i < N; i++) { 501af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler bigArray[i] = (byte)((i*i) & 0xFF); 511af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler } 521a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler 537d3c7390a8cbeff12fe790e5d12da6e07cf8c298Richard Uhler NativeAllocationRegistry registry = new NativeAllocationRegistry( 547d3c7390a8cbeff12fe790e5d12da6e07cf8c298Richard Uhler Main.class.getClassLoader(), 0x12345, 42); 551a5baaabcdd79997508c91f1d8b1cf8547c9d1cfRichard Uhler registry.registerNativeAllocation(anObject, 0xABCDABCD); 561af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler } 573524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler } 583524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler 593524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler public static void main(String[] args) throws IOException { 603524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler if (args.length < 1) { 613524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler System.err.println("no output file specified"); 623524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler return; 633524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler } 643524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler String file = args[0]; 653524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler 663524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // Allocate the instance of DumpedStuff. 673524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler stuff = new DumpedStuff(); 683524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler 693524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler // Take a heap dump that will include that instance of DumpedStuff. 703524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler System.err.println("Dumping hprof data to " + file); 713524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler VMDebug.dumpHprofData(file); 723524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler } 733524472e8f064dbd42e1a35d511a1efe36d2cbf2Richard Uhler} 74