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 java.io.IOException; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileInputStream; 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.ObjectInputStream; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.BufferedInputStream; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.Writer; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.PrintStream; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Set; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.HashSet; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.TreeSet; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Iterator; 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Prints raw information in CSV format. 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class PrintCsv { 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static void main(String[] args) 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throws IOException, ClassNotFoundException { 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (args.length != 1) { 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski System.err.println("Usage: PrintCsv [compiled log file]"); 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski System.exit(0); 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Root root = Root.fromFile(args[0]); 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski printHeaders(System.out); 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski MemoryUsage baseline = MemoryUsage.baseline(); 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (LoadedClass loadedClass : root.loadedClasses.values()) { 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (!loadedClass.systemClass) { 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski continue; 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski printRow(System.out, baseline, loadedClass); 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static void printHeaders(PrintStream out) { 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.println("Name" 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Preloaded" 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Median Load Time (us)" 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Median Init Time (us)" 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Process Names" 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Load Count" 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Init Count" 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Managed Heap (B)" 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Native Heap (B)" 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Managed Pages (kB)" 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Native Pages (kB)" 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + ",Other Pages (kB)"); 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static void printRow(PrintStream out, MemoryUsage baseline, 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LoadedClass loadedClass) { 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(loadedClass.name); 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(loadedClass.preloaded); 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(loadedClass.medianLoadTimeMicros()); 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(loadedClass.medianInitTimeMicros()); 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print('"'); 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Set<String> procNames = new TreeSet<String>(); 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (Operation op : loadedClass.loads) 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski procNames.add(op.process.name); 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (Operation op : loadedClass.initializations) 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski procNames.add(op.process.name); 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (procNames.size() <= 3) { 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (String name : procNames) { 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(name + "\n"); 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } else { 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Iterator<String> i = procNames.iterator(); 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(i.next() + "\n"); 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(i.next() + "\n"); 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print("...and " + (procNames.size() - 2) 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski + " others."); 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print('"'); 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(loadedClass.loads.size()); 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(loadedClass.initializations.size()); 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (loadedClass.memoryUsage.isAvailable()) { 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski MemoryUsage subtracted 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski = loadedClass.memoryUsage.subtract(baseline); 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(subtracted.javaHeapSize()); 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(subtracted.nativeHeapSize); 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(subtracted.javaPagesInK()); 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(subtracted.nativePagesInK()); 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(','); 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(subtracted.otherPagesInK()); 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } else { 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.print(",n/a,n/a,n/a,n/a,n/a"); 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski out.println(); 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 128