1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import dalvik.system.VMDebug; 18 import java.io.IOException; 19 import java.lang.ref.PhantomReference; 20 import java.lang.ref.ReferenceQueue; 21 import java.lang.ref.WeakReference; 22 import libcore.util.NativeAllocationRegistry; 23 24 /** 25 * Program used to create a heap dump for test purposes. 26 */ 27 public class Main { 28 // Keep a reference to the DumpedStuff instance so that it is not garbage 29 // collected before we take the heap dump. 30 public static DumpedStuff stuff; 31 32 // We will take a heap dump that includes a single instance of this 33 // DumpedStuff class. Objects stored as fields in this class can be easily 34 // found in the hprof dump by searching for the instance of the DumpedStuff 35 // class and reading the desired field. 36 public static class DumpedStuff { 37 public String basicString = "hello, world"; 38 public char[] charArray = "char thing".toCharArray(); 39 public String nullString = null; 40 public Object anObject = new Object(); 41 public ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>(); 42 public PhantomReference aPhantomReference = new PhantomReference(anObject, referenceQueue); 43 public WeakReference aWeakReference = new WeakReference(anObject, referenceQueue); 44 public byte[] bigArray; 45 DumpedStuff()46 DumpedStuff() { 47 int N = 1000000; 48 bigArray = new byte[N]; 49 for (int i = 0; i < N; i++) { 50 bigArray[i] = (byte)((i*i) & 0xFF); 51 } 52 53 NativeAllocationRegistry registry = new NativeAllocationRegistry( 54 Main.class.getClassLoader(), 0x12345, 42); 55 registry.registerNativeAllocation(anObject, 0xABCDABCD); 56 } 57 } 58 main(String[] args)59 public static void main(String[] args) throws IOException { 60 if (args.length < 1) { 61 System.err.println("no output file specified"); 62 return; 63 } 64 String file = args[0]; 65 66 // Allocate the instance of DumpedStuff. 67 stuff = new DumpedStuff(); 68 69 // Take a heap dump that will include that instance of DumpedStuff. 70 System.err.println("Dumping hprof data to " + file); 71 VMDebug.dumpHprofData(file); 72 } 73 } 74