| /* | |
| * Copyright (C) 2008 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| import java.io.IOException; | |
| import java.io.FileInputStream; | |
| import java.io.ObjectInputStream; | |
| import java.io.BufferedInputStream; | |
| import java.io.Writer; | |
| import java.io.PrintStream; | |
| import java.util.Set; | |
| import java.util.HashSet; | |
| import java.util.TreeSet; | |
| import java.util.Iterator; | |
| /** | |
| * Prints raw information in CSV format. | |
| */ | |
| public class PrintCsv { | |
| public static void main(String[] args) | |
| throws IOException, ClassNotFoundException { | |
| if (args.length != 1) { | |
| System.err.println("Usage: PrintCsv [compiled log file]"); | |
| System.exit(0); | |
| } | |
| Root root = Root.fromFile(args[0]); | |
| printHeaders(System.out); | |
| MemoryUsage baseline = MemoryUsage.baseline(); | |
| for (LoadedClass loadedClass : root.loadedClasses.values()) { | |
| if (!loadedClass.systemClass) { | |
| continue; | |
| } | |
| printRow(System.out, baseline, loadedClass); | |
| } | |
| } | |
| static void printHeaders(PrintStream out) { | |
| out.println("Name" | |
| + ",Preloaded" | |
| + ",Median Load Time (us)" | |
| + ",Median Init Time (us)" | |
| + ",Process Names" | |
| + ",Load Count" | |
| + ",Init Count" | |
| + ",Managed Heap (B)" | |
| + ",Native Heap (B)" | |
| + ",Managed Pages (kB)" | |
| + ",Native Pages (kB)" | |
| + ",Other Pages (kB)"); | |
| } | |
| static void printRow(PrintStream out, MemoryUsage baseline, | |
| LoadedClass loadedClass) { | |
| out.print(loadedClass.name); | |
| out.print(','); | |
| out.print(loadedClass.preloaded); | |
| out.print(','); | |
| out.print(loadedClass.medianLoadTimeMicros()); | |
| out.print(','); | |
| out.print(loadedClass.medianInitTimeMicros()); | |
| out.print(','); | |
| out.print('"'); | |
| Set<String> procNames = new TreeSet<String>(); | |
| for (Operation op : loadedClass.loads) | |
| procNames.add(op.process.name); | |
| for (Operation op : loadedClass.initializations) | |
| procNames.add(op.process.name); | |
| if (procNames.size() <= 3) { | |
| for (String name : procNames) { | |
| out.print(name + "\n"); | |
| } | |
| } else { | |
| Iterator<String> i = procNames.iterator(); | |
| out.print(i.next() + "\n"); | |
| out.print(i.next() + "\n"); | |
| out.print("...and " + (procNames.size() - 2) | |
| + " others."); | |
| } | |
| out.print('"'); | |
| out.print(','); | |
| out.print(loadedClass.loads.size()); | |
| out.print(','); | |
| out.print(loadedClass.initializations.size()); | |
| if (loadedClass.memoryUsage.isAvailable()) { | |
| MemoryUsage subtracted | |
| = loadedClass.memoryUsage.subtract(baseline); | |
| out.print(','); | |
| out.print(subtracted.javaHeapSize()); | |
| out.print(','); | |
| out.print(subtracted.nativeHeapSize); | |
| out.print(','); | |
| out.print(subtracted.javaPagesInK()); | |
| out.print(','); | |
| out.print(subtracted.nativePagesInK()); | |
| out.print(','); | |
| out.print(subtracted.otherPagesInK()); | |
| } else { | |
| out.print(",n/a,n/a,n/a,n/a,n/a"); | |
| } | |
| out.println(); | |
| } | |
| } |