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