131 lines
3.4 KiB
Java
131 lines
3.4 KiB
Java
/*
|
|
* 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<LoadedClass> {
|
|
|
|
private static final long serialVersionUID = 0;
|
|
|
|
/** Class name. */
|
|
final String name;
|
|
|
|
/** Load operations. */
|
|
final List<Operation> loads = new ArrayList<Operation>();
|
|
|
|
/** Static initialization operations. */
|
|
final List<Operation> initializations = new ArrayList<Operation>();
|
|
|
|
/** 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<Operation> 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<String> processNames() {
|
|
Set<String> names = new HashSet<String>();
|
|
addProcessNames(loads, names);
|
|
addProcessNames(initializations, names);
|
|
return names;
|
|
}
|
|
|
|
private void addProcessNames(List<Operation> ops, Set<String> 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;
|
|
}
|
|
}
|