1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2008 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.Log; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Debug; 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Loads a class, runs the garbage collector, and prints showmap output. 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * <p>Usage: dalvikvm LoadClass [class name] 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass LoadClass { 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static void main(String[] args) { 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski System.loadLibrary("android_runtime"); 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (registerNatives() < 0) { 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new RuntimeException("Error registering natives."); 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Debug.startAllocCounting(); 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (args.length > 0) { 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski long start = System.currentTimeMillis(); 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Class.forName(args[0]); 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski long elapsed = System.currentTimeMillis() - start; 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Log.i("LoadClass", "Loaded " + args[0] + " in " + elapsed 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + "ms."); 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (ClassNotFoundException e) { 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Log.w("LoadClass", e); 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return; 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski System.gc(); 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int allocCount = Debug.getGlobalAllocCount(); 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int allocSize = Debug.getGlobalAllocSize(); 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int freedCount = Debug.getGlobalFreedCount(); 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int freedSize = Debug.getGlobalFreedSize(); 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski long nativeHeapSize = Debug.getNativeHeapSize(); 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Debug.stopAllocCounting(); 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StringBuilder response = new StringBuilder("DECAFBAD"); 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int[] pages = new int[6]; 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo(); 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Debug.getMemoryInfo(memoryInfo); 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(memoryInfo.nativeSharedDirty); 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(memoryInfo.dalvikSharedDirty); 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(memoryInfo.otherSharedDirty); 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(memoryInfo.nativePrivateDirty); 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(memoryInfo.dalvikPrivateDirty); 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(memoryInfo.otherPrivateDirty); 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(allocCount); 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(allocSize); 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(freedCount); 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(freedSize); 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski response.append(',').append(nativeHeapSize); 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski System.out.println(response.toString()); 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Registers native functions. See AndroidRuntime.cpp. 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static native int registerNatives(); 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 85