blob: 9b0deb9963577caeacf7c3646afee7049aaa2776 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.management;
27
28import java.util.regex.*;
29import java.util.List;
30import java.util.ListIterator;
31import java.util.Iterator;
32import java.util.ArrayList;
33import java.util.Map;
34import java.util.TreeMap;
35import sun.management.counter.*;
36
37/**
38 * Implementation class of HotspotCompilationMBean interface.
39 *
40 * Internal, uncommitted management interface for Hotspot compilation
41 * system.
42 *
43 */
44class HotspotCompilation
45 implements HotspotCompilationMBean {
46
47 private VMManagement jvm;
48
49 /**
50 * Constructor of HotspotRuntime class.
51 */
52 HotspotCompilation(VMManagement vm) {
53 jvm = vm;
54 initCompilerCounters();
55 }
56
57 // Performance counter support
58 private static final String JAVA_CI = "java.ci.";
59 private static final String COM_SUN_CI = "com.sun.ci.";
60 private static final String SUN_CI = "sun.ci.";
61 private static final String CI_COUNTER_NAME_PATTERN =
62 JAVA_CI + "|" + COM_SUN_CI + "|" + SUN_CI;
63
64 private LongCounter compilerThreads;
65 private LongCounter totalCompiles;
66 private LongCounter totalBailouts;
67 private LongCounter totalInvalidates;
68 private LongCounter nmethodCodeSize;
69 private LongCounter nmethodSize;
70 private StringCounter lastMethod;
71 private LongCounter lastSize;
72 private LongCounter lastType;
73 private StringCounter lastFailedMethod;
74 private LongCounter lastFailedType;
75 private StringCounter lastInvalidatedMethod;
76 private LongCounter lastInvalidatedType;
77
78 private class CompilerThreadInfo {
79 int index;
80 String name;
81 StringCounter method;
82 LongCounter type;
83 LongCounter compiles;
84 LongCounter time;
85 CompilerThreadInfo(String bname, int index) {
86 String basename = bname + "." + index + ".";
87 this.name = bname + "-" + index;
88 this.method = (StringCounter) lookup(basename + "method");
89 this.type = (LongCounter) lookup(basename + "type");
90 this.compiles = (LongCounter) lookup(basename + "compiles");
91 this.time = (LongCounter) lookup(basename + "time");
92 }
93 CompilerThreadInfo(String bname) {
94 String basename = bname + ".";
95 this.name = bname;
96 this.method = (StringCounter) lookup(basename + "method");
97 this.type = (LongCounter) lookup(basename + "type");
98 this.compiles = (LongCounter) lookup(basename + "compiles");
99 this.time = (LongCounter) lookup(basename + "time");
100 }
101
102 CompilerThreadStat getCompilerThreadStat() {
103 MethodInfo minfo = new MethodInfo(method.stringValue(),
104 (int) type.longValue(),
105 -1);
106 return new CompilerThreadStat(name,
107 compiles.longValue(),
108 time.longValue(),
109 minfo);
110 }
111 }
112 private CompilerThreadInfo[] threads;
113 private int numActiveThreads; // number of active compiler threads
114
115 private Map<String, Counter> counters;
116 private Counter lookup(String name) {
117 Counter c = null;
118
119 // Only one counter exists with the specified name in the
120 // current implementation. We first look up in the SUN_CI namespace
121 // since most counters are in SUN_CI namespace.
122
123 if ((c = (Counter) counters.get(SUN_CI + name)) != null) {
124 return c;
125 }
126 if ((c = (Counter) counters.get(COM_SUN_CI + name)) != null) {
127 return c;
128 }
129 if ((c = (Counter) counters.get(JAVA_CI + name)) != null) {
130 return c;
131 }
132
133 // FIXME: should tolerate if counter doesn't exist
134 throw new InternalError("Counter " + name + " does not exist");
135 }
136
137 private void initCompilerCounters() {
138 // Build a tree map of the current list of performance counters
139 ListIterator iter = getInternalCompilerCounters().listIterator();
140 counters = new TreeMap<String, Counter>();
141 while (iter.hasNext()) {
142 Counter c = (Counter) iter.next();
143 counters.put(c.getName(), c);
144 }
145
146 compilerThreads = (LongCounter) lookup("threads");
147 totalCompiles = (LongCounter) lookup("totalCompiles");
148 totalBailouts = (LongCounter) lookup("totalBailouts");
149 totalInvalidates = (LongCounter) lookup("totalInvalidates");
150 nmethodCodeSize = (LongCounter) lookup("nmethodCodeSize");
151 nmethodSize = (LongCounter) lookup("nmethodSize");
152 lastMethod = (StringCounter) lookup("lastMethod");
153 lastSize = (LongCounter) lookup("lastSize");
154 lastType = (LongCounter) lookup("lastType");
155 lastFailedMethod = (StringCounter) lookup("lastFailedMethod");
156 lastFailedType = (LongCounter) lookup("lastFailedType");
157 lastInvalidatedMethod = (StringCounter) lookup("lastInvalidatedMethod");
158 lastInvalidatedType = (LongCounter) lookup("lastInvalidatedType");
159
160 numActiveThreads = (int) compilerThreads.longValue();
161
162 // Allocate CompilerThreadInfo for compilerThread and adaptorThread
163 threads = new CompilerThreadInfo[numActiveThreads+1];
164
165 // AdaptorThread has index 0
166 if (counters.containsKey(SUN_CI + "adapterThread.compiles")) {
167 threads[0] = new CompilerThreadInfo("adapterThread", 0);
168 numActiveThreads++;
169 } else {
170 threads[0] = null;
171 }
172
173 for (int i = 1; i < threads.length; i++) {
174 threads[i] = new CompilerThreadInfo("compilerThread", i-1);
175 }
176 }
177
178 public int getCompilerThreadCount() {
179 return numActiveThreads;
180 }
181
182 public long getTotalCompileCount() {
183 return totalCompiles.longValue();
184 }
185
186 public long getBailoutCompileCount() {
187 return totalBailouts.longValue();
188 }
189
190 public long getInvalidatedCompileCount() {
191 return totalInvalidates.longValue();
192 }
193
194 public long getCompiledMethodCodeSize() {
195 return nmethodCodeSize.longValue();
196 }
197
198 public long getCompiledMethodSize() {
199 return nmethodSize.longValue();
200 }
201
202 public java.util.List<CompilerThreadStat> getCompilerThreadStats() {
203 List<CompilerThreadStat> list = new ArrayList<CompilerThreadStat>(threads.length);
204 int i = 0;
205 if (threads[0] == null) {
206 // no adaptor thread
207 i = 1;
208 }
209 for (; i < threads.length; i++) {
210 list.add(threads[i].getCompilerThreadStat());
211 }
212 return list;
213 }
214
215 public MethodInfo getLastCompile() {
216 return new MethodInfo(lastMethod.stringValue(),
217 (int) lastType.longValue(),
218 (int) lastSize.longValue());
219 }
220
221 public MethodInfo getFailedCompile() {
222 return new MethodInfo(lastFailedMethod.stringValue(),
223 (int) lastFailedType.longValue(),
224 -1);
225 }
226
227 public MethodInfo getInvalidatedCompile() {
228 return new MethodInfo(lastInvalidatedMethod.stringValue(),
229 (int) lastInvalidatedType.longValue(),
230 -1);
231 }
232
233 public java.util.List<Counter> getInternalCompilerCounters() {
234 return jvm.getInternalCounters(CI_COUNTER_NAME_PATTERN);
235 }
236}