xref: /aosp_15_r20/frameworks/base/tools/preload/LoadedClass.java (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker import java.io.Serializable;
18*d57664e9SAndroid Build Coastguard Worker import java.util.*;
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker /**
21*d57664e9SAndroid Build Coastguard Worker  * A loaded class.
22*d57664e9SAndroid Build Coastguard Worker  */
23*d57664e9SAndroid Build Coastguard Worker class LoadedClass implements Serializable, Comparable<LoadedClass> {
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker     private static final long serialVersionUID = 0;
26*d57664e9SAndroid Build Coastguard Worker 
27*d57664e9SAndroid Build Coastguard Worker     /** Class name. */
28*d57664e9SAndroid Build Coastguard Worker     final String name;
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker     /** Load operations. */
31*d57664e9SAndroid Build Coastguard Worker     final List<Operation> loads = new ArrayList<Operation>();
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker     /** Static initialization operations. */
34*d57664e9SAndroid Build Coastguard Worker     final List<Operation> initializations = new ArrayList<Operation>();
35*d57664e9SAndroid Build Coastguard Worker 
36*d57664e9SAndroid Build Coastguard Worker     /** Memory usage gathered by loading only this class in its own VM. */
37*d57664e9SAndroid Build Coastguard Worker     MemoryUsage memoryUsage = MemoryUsage.NOT_AVAILABLE;
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker     /**
40*d57664e9SAndroid Build Coastguard Worker      * Whether or not this class was loaded in the system class loader.
41*d57664e9SAndroid Build Coastguard Worker      */
42*d57664e9SAndroid Build Coastguard Worker     final boolean systemClass;
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker     /** Whether or not this class will be preloaded. */
45*d57664e9SAndroid Build Coastguard Worker     boolean preloaded;
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker     /** Constructs a new class. */
LoadedClass(String name, boolean systemClass)48*d57664e9SAndroid Build Coastguard Worker     LoadedClass(String name, boolean systemClass) {
49*d57664e9SAndroid Build Coastguard Worker         this.name = name;
50*d57664e9SAndroid Build Coastguard Worker         this.systemClass = systemClass;
51*d57664e9SAndroid Build Coastguard Worker     }
52*d57664e9SAndroid Build Coastguard Worker 
measureMemoryUsage()53*d57664e9SAndroid Build Coastguard Worker     void measureMemoryUsage() {
54*d57664e9SAndroid Build Coastguard Worker         this.memoryUsage = MemoryUsage.forClass(name);
55*d57664e9SAndroid Build Coastguard Worker     }
56*d57664e9SAndroid Build Coastguard Worker 
57*d57664e9SAndroid Build Coastguard Worker     int mlt = -1;
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker     /** Median time to load this class. */
medianLoadTimeMicros()60*d57664e9SAndroid Build Coastguard Worker     int medianLoadTimeMicros() {
61*d57664e9SAndroid Build Coastguard Worker         if (mlt != -1) {
62*d57664e9SAndroid Build Coastguard Worker             return mlt;
63*d57664e9SAndroid Build Coastguard Worker         }
64*d57664e9SAndroid Build Coastguard Worker 
65*d57664e9SAndroid Build Coastguard Worker         return mlt = calculateMedian(loads);
66*d57664e9SAndroid Build Coastguard Worker     }
67*d57664e9SAndroid Build Coastguard Worker 
68*d57664e9SAndroid Build Coastguard Worker     int mit = -1;
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker     /** Median time to initialize this class. */
medianInitTimeMicros()71*d57664e9SAndroid Build Coastguard Worker     int medianInitTimeMicros() {
72*d57664e9SAndroid Build Coastguard Worker         if (mit != -1) {
73*d57664e9SAndroid Build Coastguard Worker             return mit;
74*d57664e9SAndroid Build Coastguard Worker         }
75*d57664e9SAndroid Build Coastguard Worker 
76*d57664e9SAndroid Build Coastguard Worker         return mit = calculateMedian(initializations);
77*d57664e9SAndroid Build Coastguard Worker     }
78*d57664e9SAndroid Build Coastguard Worker 
medianTimeMicros()79*d57664e9SAndroid Build Coastguard Worker     int medianTimeMicros() {
80*d57664e9SAndroid Build Coastguard Worker         return medianInitTimeMicros() + medianLoadTimeMicros();
81*d57664e9SAndroid Build Coastguard Worker     }
82*d57664e9SAndroid Build Coastguard Worker 
83*d57664e9SAndroid Build Coastguard Worker     /** Calculates the median duration for a list of operations. */
calculateMedian(List<Operation> operations)84*d57664e9SAndroid Build Coastguard Worker     private static int calculateMedian(List<Operation> operations) {
85*d57664e9SAndroid Build Coastguard Worker         int size = operations.size();
86*d57664e9SAndroid Build Coastguard Worker         if (size == 0) {
87*d57664e9SAndroid Build Coastguard Worker             return 0;
88*d57664e9SAndroid Build Coastguard Worker         }
89*d57664e9SAndroid Build Coastguard Worker 
90*d57664e9SAndroid Build Coastguard Worker         int[] times = new int[size];
91*d57664e9SAndroid Build Coastguard Worker         for (int i = 0; i < size; i++) {
92*d57664e9SAndroid Build Coastguard Worker             times[i] = operations.get(i).exclusiveTimeMicros();
93*d57664e9SAndroid Build Coastguard Worker         }
94*d57664e9SAndroid Build Coastguard Worker 
95*d57664e9SAndroid Build Coastguard Worker         Arrays.sort(times);
96*d57664e9SAndroid Build Coastguard Worker         int middle = size / 2;
97*d57664e9SAndroid Build Coastguard Worker         if (size % 2 == 1) {
98*d57664e9SAndroid Build Coastguard Worker             // Odd
99*d57664e9SAndroid Build Coastguard Worker             return times[middle];
100*d57664e9SAndroid Build Coastguard Worker         } else {
101*d57664e9SAndroid Build Coastguard Worker             // Even -- average the two.
102*d57664e9SAndroid Build Coastguard Worker             return (times[middle - 1] + times[middle]) / 2;
103*d57664e9SAndroid Build Coastguard Worker         }
104*d57664e9SAndroid Build Coastguard Worker     }
105*d57664e9SAndroid Build Coastguard Worker 
106*d57664e9SAndroid Build Coastguard Worker     /** Returns names of processes that loaded this class. */
processNames()107*d57664e9SAndroid Build Coastguard Worker     Set<String> processNames() {
108*d57664e9SAndroid Build Coastguard Worker         Set<String> names = new HashSet<String>();
109*d57664e9SAndroid Build Coastguard Worker         addProcessNames(loads, names);
110*d57664e9SAndroid Build Coastguard Worker         addProcessNames(initializations, names);
111*d57664e9SAndroid Build Coastguard Worker         return names;
112*d57664e9SAndroid Build Coastguard Worker     }
113*d57664e9SAndroid Build Coastguard Worker 
addProcessNames(List<Operation> ops, Set<String> names)114*d57664e9SAndroid Build Coastguard Worker     private void addProcessNames(List<Operation> ops, Set<String> names) {
115*d57664e9SAndroid Build Coastguard Worker         for (Operation operation : ops) {
116*d57664e9SAndroid Build Coastguard Worker             if (operation.process.fromZygote()) {
117*d57664e9SAndroid Build Coastguard Worker                 names.add(operation.process.name);
118*d57664e9SAndroid Build Coastguard Worker             }
119*d57664e9SAndroid Build Coastguard Worker         }
120*d57664e9SAndroid Build Coastguard Worker     }
121*d57664e9SAndroid Build Coastguard Worker 
compareTo(LoadedClass o)122*d57664e9SAndroid Build Coastguard Worker     public int compareTo(LoadedClass o) {
123*d57664e9SAndroid Build Coastguard Worker         return name.compareTo(o.name);
124*d57664e9SAndroid Build Coastguard Worker     }
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker     @Override
toString()127*d57664e9SAndroid Build Coastguard Worker     public String toString() {
128*d57664e9SAndroid Build Coastguard Worker         return name;
129*d57664e9SAndroid Build Coastguard Worker     }
130*d57664e9SAndroid Build Coastguard Worker }
131