/* * 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.Serializable; import java.util.*; /** * A loaded class. */ class LoadedClass implements Serializable, Comparable { private static final long serialVersionUID = 0; /** Class name. */ final String name; /** Load operations. */ final List loads = new ArrayList(); /** Static initialization operations. */ final List initializations = new ArrayList(); /** Memory usage gathered by loading only this class in its own VM. */ MemoryUsage memoryUsage = MemoryUsage.NOT_AVAILABLE; /** * Whether or not this class was loaded in the system class loader. */ final boolean systemClass; /** Whether or not this class will be preloaded. */ boolean preloaded; /** Constructs a new class. */ LoadedClass(String name, boolean systemClass) { this.name = name; this.systemClass = systemClass; } void measureMemoryUsage() { this.memoryUsage = MemoryUsage.forClass(name); } int mlt = -1; /** Median time to load this class. */ int medianLoadTimeMicros() { if (mlt != -1) { return mlt; } return mlt = calculateMedian(loads); } int mit = -1; /** Median time to initialize this class. */ int medianInitTimeMicros() { if (mit != -1) { return mit; } return mit = calculateMedian(initializations); } int medianTimeMicros() { return medianInitTimeMicros() + medianLoadTimeMicros(); } /** Calculates the median duration for a list of operations. */ private static int calculateMedian(List operations) { int size = operations.size(); if (size == 0) { return 0; } int[] times = new int[size]; for (int i = 0; i < size; i++) { times[i] = operations.get(i).exclusiveTimeMicros(); } Arrays.sort(times); int middle = size / 2; if (size % 2 == 1) { // Odd return times[middle]; } else { // Even -- average the two. return (times[middle - 1] + times[middle]) / 2; } } /** Returns names of processes that loaded this class. */ Set processNames() { Set names = new HashSet(); addProcessNames(loads, names); addProcessNames(initializations, names); return names; } private void addProcessNames(List ops, Set names) { for (Operation operation : ops) { if (operation.process.fromZygote()) { names.add(operation.process.name); } } } public int compareTo(LoadedClass o) { return name.compareTo(o.name); } @Override public String toString() { return name; } }