annotate src/share/vm/runtime/fprofiler.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents da91efe96a93
children aeaca88565e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 605
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 605
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 605
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "code/vtableStubs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "oops/oop.inline2.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
34 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "runtime/stubCodeGenerator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 #include "runtime/task.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 #include "runtime/vframe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #include "utilities/macros.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Static fields of FlatProfiler
a61af66fc99e Initial load
duke
parents:
diff changeset
45 int FlatProfiler::received_gc_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 int FlatProfiler::vm_operation_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 int FlatProfiler::threads_lock_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 int FlatProfiler::class_loader_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 int FlatProfiler::extra_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 int FlatProfiler::blocked_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 int FlatProfiler::deopt_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 int FlatProfiler::unknown_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 int FlatProfiler::interpreter_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 int FlatProfiler::compiler_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 int FlatProfiler::received_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 int FlatProfiler::delivered_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 int* FlatProfiler::bytecode_ticks = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 int* FlatProfiler::bytecode_ticks_stub = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 int FlatProfiler::all_int_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 int FlatProfiler::all_comp_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 int FlatProfiler::all_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 bool FlatProfiler::full_profile_flag = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 ThreadProfiler* FlatProfiler::thread_profiler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 ThreadProfiler* FlatProfiler::vm_thread_profiler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 FlatProfilerTask* FlatProfiler::task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 elapsedTimer FlatProfiler::timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 int FlatProfiler::interval_ticks_previous = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 IntervalData* FlatProfiler::interval_data = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 ThreadProfiler::ThreadProfiler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Space for the ProfilerNodes
a61af66fc99e Initial load
duke
parents:
diff changeset
72 const int area_size = 1 * ProfilerNodeSize * 1024;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
73 area_bottom = AllocateHeap(area_size, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 area_top = area_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 area_limit = area_bottom + area_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // ProfilerNode pointer table
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
78 table = NEW_C_HEAP_ARRAY(ProfilerNode*, table_size, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
80 engaged = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 ThreadProfiler::~ThreadProfiler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 FreeHeap(area_bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 area_bottom = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 area_top = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 area_limit = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 FreeHeap(table);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 table = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // Statics for ThreadProfiler
a61af66fc99e Initial load
duke
parents:
diff changeset
93 int ThreadProfiler::table_size = 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 int ThreadProfiler::entry(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 value = (value > 0) ? value : -value;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 return value % table_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 ThreadProfilerMark::ThreadProfilerMark(ThreadProfilerMark::Region r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _r = r;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _pp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 assert(((r > ThreadProfilerMark::noRegion) && (r < ThreadProfilerMark::maxRegion)), "ThreadProfilerMark::Region out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
104 Thread* tp = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
105 if (tp != NULL && tp->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 JavaThread* jtp = (JavaThread*) tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 ThreadProfiler* pp = jtp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _pp = pp;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 pp->region_flag[r] = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 ThreadProfilerMark::~ThreadProfilerMark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (_pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 _pp->region_flag[_r] = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _pp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Random other statics
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static const int col1 = 2; // position of output column 1
a61af66fc99e Initial load
duke
parents:
diff changeset
124 static const int col2 = 11; // position of output column 2
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static const int col3 = 25; // position of output column 3
a61af66fc99e Initial load
duke
parents:
diff changeset
126 static const int col4 = 55; // position of output column 4
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Used for detailed profiling of nmethods.
a61af66fc99e Initial load
duke
parents:
diff changeset
130 class PCRecorder : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
132 static int* counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 static address base;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 bucket_size = 16
a61af66fc99e Initial load
duke
parents:
diff changeset
136 };
a61af66fc99e Initial load
duke
parents:
diff changeset
137 static int index_for(address pc) { return (pc - base)/bucket_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 static address pc_for(int index) { return base + (index * bucket_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 static int size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 return ((int)CodeCache::max_capacity())/bucket_size * BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
143 static address bucket_start_for(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (counters == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return pc_for(index_for(pc));
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static int bucket_count_for(address pc) { return counters[index_for(pc)]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 static void init();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 static void record(address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 static void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 static void print_blobs(CodeBlob* cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 };
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int* PCRecorder::counters = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 address PCRecorder::base = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 void PCRecorder::init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 MutexLockerEx lm(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 int s = size();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
160 counters = NEW_C_HEAP_ARRAY(int, s, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
161 for (int index = 0; index < s; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 counters[index] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 base = CodeCache::first_address();
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 void PCRecorder::record(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 if (counters == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(CodeCache::contains(pc), "must be in CodeCache");
a61af66fc99e Initial load
duke
parents:
diff changeset
170 counters[index_for(pc)]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 address FlatProfiler::bucket_start_for(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return PCRecorder::bucket_start_for(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 int FlatProfiler::bucket_count_for(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 return PCRecorder::bucket_count_for(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void PCRecorder::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (counters == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
186 tty->print_cr("Printing compiled methods with PC buckets having more than %d ticks", ProfilerPCTickThreshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 tty->print_cr("===================================================================");
a61af66fc99e Initial load
duke
parents:
diff changeset
188 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 GrowableArray<CodeBlob*>* candidates = new GrowableArray<CodeBlob*>(20);
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 int s;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 MutexLockerEx lm(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 s = size();
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 for (int index = 0; index < s; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 int count = counters[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (count > ProfilerPCTickThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 address pc = pc_for(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (cb != NULL && candidates->find(cb) < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 candidates->push(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 for (int i = 0; i < candidates->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 print_blobs(candidates->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 void PCRecorder::print_blobs(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (cb != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 ((nmethod*)cb)->print_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 tty->print_cr("stub code");
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 class tick_counter { // holds tick info for one node
a61af66fc99e Initial load
duke
parents:
diff changeset
227 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
228 int ticks_in_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 int ticks_in_native;
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 tick_counter() { ticks_in_code = ticks_in_native = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 tick_counter(int code, int native) { ticks_in_code = code; ticks_in_native = native; }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 int total() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 return (ticks_in_code + ticks_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void add(tick_counter* a) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 ticks_in_code += a->ticks_in_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ticks_in_native += a->ticks_in_native;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 void update(TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 switch(where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 case tp_code: ticks_in_code++; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 case tp_native: ticks_in_native++; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void print_code(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 st->print("%5.1f%% %5d ", total() * 100.0 / total_ticks, ticks_in_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 void print_native(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 st->print(" + %5d ", ticks_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 };
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 class ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
261 ProfilerNode* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
263 tick_counter ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 void* operator new(size_t size, ThreadProfiler* tp);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void operator delete(void* p);
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 virtual ~ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 if (_next)
a61af66fc99e Initial load
duke
parents:
diff changeset
276 delete _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void set_next(ProfilerNode* n) { _next = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 ProfilerNode* next() { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 void update(TickPosition where) { ticks.update(where);}
a61af66fc99e Initial load
duke
parents:
diff changeset
283 int total_ticks() { return ticks.total(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 virtual bool is_interpreted() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 virtual bool is_compiled() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 virtual bool is_stub() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 virtual bool is_runtime_stub() const{ return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 virtual void oops_do(OopClosure* f) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
290
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
291 virtual bool interpreted_match(Method* m) const { return false; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
292 virtual bool compiled_match(Method* m ) const { return false; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
293 virtual bool stub_match(Method* m, const char* name) const { return false; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 virtual bool adapter_match() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
295 virtual bool runtimeStub_match(const CodeBlob* stub, const char* name) const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 virtual bool unknown_compiled_match(const CodeBlob* cb) const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 st->print(" + native");
a61af66fc99e Initial load
duke
parents:
diff changeset
300 st->fill_to(col3);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 st->print("Method");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 st->fill_to(col4);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 static void print_total(outputStream* st, tick_counter* t, int total, const char* msg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 t->print_code(st, total);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 st->fill_to(col2);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 t->print_native(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 st->fill_to(col3);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 st->print(msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
315 virtual Method* method() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 virtual void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 int limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 int i;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
320 Method* m = method();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
321 Symbol* k = m->klass_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // Print the class name with dots instead of slashes
a61af66fc99e Initial load
duke
parents:
diff changeset
323 limit = k->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 for (i = 0 ; i < limit ; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 char c = (char) k->byte_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 if (c == '/') {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 c = '.';
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329 st->print("%c", c);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 if (limit > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 st->print(".");
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
334 Symbol* n = m->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 limit = n->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
336 for (i = 0 ; i < limit ; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 char c = (char) n->byte_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
338 st->print("%c", c);
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
340 if (Verbose || WizardMode) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // Disambiguate overloaded methods
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
342 Symbol* sig = m->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
343 sig->print_symbol_on(st);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
344 } else if (MethodHandles::is_signature_polymorphic(m->intrinsic_id()))
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
345 // compare with Method::print_short_name
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
346 MethodHandles::print_as_basic_type_signature_on(st, m->signature(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 virtual void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 ticks.print_code(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 st->fill_to(col2);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 ticks.print_native(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 st->fill_to(col3);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 print_method_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
355 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // for hashing into the table
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
359 static int hash(Method* method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // The point here is to try to make something fairly unique
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // out of the fields we can read without grabbing any locks
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // since the method may be locked when we need the hash.
a61af66fc99e Initial load
duke
parents:
diff changeset
363 return (
a61af66fc99e Initial load
duke
parents:
diff changeset
364 method->code_size() ^
a61af66fc99e Initial load
duke
parents:
diff changeset
365 method->max_stack() ^
a61af66fc99e Initial load
duke
parents:
diff changeset
366 method->max_locals() ^
a61af66fc99e Initial load
duke
parents:
diff changeset
367 method->size_of_parameters());
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // for sorting
a61af66fc99e Initial load
duke
parents:
diff changeset
371 static int compare(ProfilerNode** a, ProfilerNode** b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 return (*b)->total_ticks() - (*a)->total_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374 };
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void* ProfilerNode::operator new(size_t size, ThreadProfiler* tp){
a61af66fc99e Initial load
duke
parents:
diff changeset
377 void* result = (void*) tp->area_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 tp->area_top += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 if (tp->area_top > tp->area_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 fatal("flat profiler buffer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 void ProfilerNode::operator delete(void* p){
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 class interpretedNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
391 Method* _method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
392 oop _class_loader; // needed to keep metadata for the method alive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
393 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
394 interpretedNode(Method* method, TickPosition where) : ProfilerNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 _method = method;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
396 _class_loader = method->method_holder()->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
397 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 bool is_interpreted() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
401
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
402 bool interpreted_match(Method* m) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 return _method == m;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void oops_do(OopClosure* f) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
407 f->do_oop(&_class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
410 Method* method() { return _method; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
414 st->print("%11s", "Interpreted");
a61af66fc99e Initial load
duke
parents:
diff changeset
415 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 ProfilerNode::print_method_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 if (Verbose) method()->invocation_counter()->print_short();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426 };
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 class compiledNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
430 Method* _method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
431 oop _class_loader; // needed to keep metadata for the method alive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
432 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
433 compiledNode(Method* method, TickPosition where) : ProfilerNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 _method = method;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
435 _class_loader = method->method_holder()->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
436 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
439
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
440 bool compiled_match(Method* m) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
441 return _method == m;
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
444 Method* method() { return _method; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 void oops_do(OopClosure* f) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
447 f->do_oop(&_class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 st->print("%11s", "Compiled");
a61af66fc99e Initial load
duke
parents:
diff changeset
453 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 ProfilerNode::print_method_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 };
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 class stubNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
467 Method* _method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
468 oop _class_loader; // needed to keep metadata for the method alive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 const char* _symbol; // The name of the nearest VM symbol (for +ProfileVM). Points to a unique string
a61af66fc99e Initial load
duke
parents:
diff changeset
470 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
471 stubNode(Method* method, const char* name, TickPosition where) : ProfilerNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
472 _method = method;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
473 _class_loader = method->method_holder()->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
474 _symbol = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 bool is_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
479
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
480 void oops_do(OopClosure* f) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
481 f->do_oop(&_class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
482 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
483
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
484 bool stub_match(Method* m, const char* name) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 return (_method == m) && (_symbol == name);
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
487
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
488 Method* method() { return _method; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 st->print("%11s", "Stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
493 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 ProfilerNode::print_method_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
502 print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 void print_symbol_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 if(_symbol) {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 st->print(" (%s)", _symbol);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510 };
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 class adapterNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
514 adapterNode(TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
517 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 bool adapter_match() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
520
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
521 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 st->print("%s", "adapters");
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
534 };
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 class runtimeStubNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
538 const CodeBlob* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
539 const char* _symbol; // The name of the nearest VM symbol when ProfileVM is on. Points to a unique string.
a61af66fc99e Initial load
duke
parents:
diff changeset
540 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
541 runtimeStubNode(const CodeBlob* stub, const char* name, TickPosition where) : ProfilerNode(), _stub(stub), _symbol(name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 assert(stub->is_runtime_stub(), "wrong code blob");
a61af66fc99e Initial load
duke
parents:
diff changeset
543 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 bool is_runtime_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 bool runtimeStub_match(const CodeBlob* stub, const char* name) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
549 assert(stub->is_runtime_stub(), "wrong code blob");
a61af66fc99e Initial load
duke
parents:
diff changeset
550 return ((RuntimeStub*)_stub)->entry_point() == ((RuntimeStub*)stub)->entry_point() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
551 (_symbol == name);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
554 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
557 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
558 st->print("%11s", "Runtime stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
559 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
567 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
571 st->print("%s", ((RuntimeStub*)_stub)->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
572 print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 void print_symbol_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 if(_symbol) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 st->print(" (%s)", _symbol);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580 };
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 class unknown_compiledNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 const char *_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
586 unknown_compiledNode(const CodeBlob* cb, TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if ( cb->is_buffer_blob() )
a61af66fc99e Initial load
duke
parents:
diff changeset
588 _name = ((BufferBlob*)cb)->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
589 else
a61af66fc99e Initial load
duke
parents:
diff changeset
590 _name = ((SingletonBlob*)cb)->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
591 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
593 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 bool unknown_compiled_match(const CodeBlob* cb) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 if ( cb->is_buffer_blob() )
a61af66fc99e Initial load
duke
parents:
diff changeset
597 return !strcmp(((BufferBlob*)cb)->name(), _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 else
a61af66fc99e Initial load
duke
parents:
diff changeset
599 return !strcmp(((SingletonBlob*)cb)->name(), _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
602 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 st->print("%s", _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
615 };
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 class vmNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
618 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
619 const char* _name; // "optional" name obtained by os means such as dll lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
620 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
621 vmNode(const TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
622 _name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
623 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 vmNode(const char* name, const TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 _name = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 const char *name() const { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
632 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 bool vm_match(const char* name) const { return strcmp(name, _name) == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
635
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
636 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 static int hash(const char* name){
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // Compute a simple hash
a61af66fc99e Initial load
duke
parents:
diff changeset
640 const char* cp = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
641 int h = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 if(name != NULL){
a61af66fc99e Initial load
duke
parents:
diff changeset
644 while(*cp != '\0'){
a61af66fc99e Initial load
duke
parents:
diff changeset
645 h = (h << 1) ^ *cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649 return h;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 }
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 if(_name==NULL){
a61af66fc99e Initial load
duke
parents:
diff changeset
662 st->print("%s", "unknown code");
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 st->print("%s", _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 };
a61af66fc99e Initial load
duke
parents:
diff changeset
669
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
670 void ThreadProfiler::interpreted_update(Method* method, TickPosition where) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
671 int index = entry(ProfilerNode::hash(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
672 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
673 table[index] = new (this) interpretedNode(method, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
676 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 if (node->interpreted_match(method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
681 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683 prev->set_next(new (this) interpretedNode(method, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
687 void ThreadProfiler::compiled_update(Method* method, TickPosition where) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 int index = entry(ProfilerNode::hash(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
689 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
690 table[index] = new (this) compiledNode(method, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
691 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
692 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
693 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 if (node->compiled_match(method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 prev->set_next(new (this) compiledNode(method, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
704 void ThreadProfiler::stub_update(Method* method, const char* name, TickPosition where) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705 int index = entry(ProfilerNode::hash(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
706 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 table[index] = new (this) stubNode(method, name, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
710 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
711 if (node->stub_match(method, name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
717 prev->set_next(new (this) stubNode(method, name, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
718 }
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 void ThreadProfiler::adapter_update(TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 table[index] = new (this) adapterNode(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
725 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
726 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
727 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 if (node->adapter_match()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
734 prev->set_next(new (this) adapterNode(where));
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 void ThreadProfiler::runtime_stub_update(const CodeBlob* stub, const char* name, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
741 table[index] = new (this) runtimeStubNode(stub, name, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
742 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
743 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
744 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
745 if (node->runtimeStub_match(stub, name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
747 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
749 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
751 prev->set_next(new (this) runtimeStubNode(stub, name, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 void ThreadProfiler::unknown_compiled_update(const CodeBlob* cb, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 table[index] = new (this) unknown_compiledNode(cb, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
760 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
761 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
762 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
763 if (node->unknown_compiled_match(cb)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
767 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769 prev->set_next(new (this) unknown_compiledNode(cb, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 void ThreadProfiler::vm_update(TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 vm_update(NULL, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 void ThreadProfiler::vm_update(const char* name, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 int index = entry(vmNode::hash(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
779 assert(index >= 0, "Must be positive");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // Note that we call strdup below since the symbol may be resource allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
781 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 table[index] = new (this) vmNode(os::strdup(name), where);
a61af66fc99e Initial load
duke
parents:
diff changeset
783 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
785 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786 if (((vmNode *)node)->vm_match(name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
787 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
790 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792 prev->set_next(new (this) vmNode(os::strdup(name), where));
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 class FlatProfilerTask : public PeriodicTask {
a61af66fc99e Initial load
duke
parents:
diff changeset
798 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
799 FlatProfilerTask(int interval_time) : PeriodicTask(interval_time) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
800 void task();
a61af66fc99e Initial load
duke
parents:
diff changeset
801 };
a61af66fc99e Initial load
duke
parents:
diff changeset
802
a61af66fc99e Initial load
duke
parents:
diff changeset
803 void FlatProfiler::record_vm_operation() {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 if (Universe::heap()->is_gc_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 FlatProfiler::received_gc_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
806 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 if (DeoptimizationMarker::is_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 FlatProfiler::deopt_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814 FlatProfiler::vm_operation_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 }
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 void FlatProfiler::record_vm_tick() {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // Profile the VM Thread itself if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // This is done without getting the Threads_lock and we can go deep
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // inside Safepoint, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
821 if( ProfileVM ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
822 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
823 ExtendedPC epc;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 char buf[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
826 buf[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 vm_thread_profiler->inc_thread_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // Get a snapshot of a current VMThread pc (and leave it running!)
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // The call may fail if, for instance the VM thread is interrupted while
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // holding the Interrupt_lock or for other reasons.
a61af66fc99e Initial load
duke
parents:
diff changeset
833 epc = os::get_thread_pc(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
834 if(epc.pc() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 if (os::dll_address_to_function_name(epc.pc(), buf, sizeof(buf), NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 name = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 vm_thread_profiler->vm_update(name, tp_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845 void FlatProfiler::record_thread_ticks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 int maxthreads, suspendedthreadcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
848 JavaThread** threadsList;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 bool interval_expired = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 if (ProfileIntervals &&
a61af66fc99e Initial load
duke
parents:
diff changeset
852 (FlatProfiler::received_ticks >= interval_ticks_previous + ProfileIntervalsTicks)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 interval_expired = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 interval_ticks_previous = FlatProfiler::received_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // Try not to wait for the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
858 if (Threads_lock->try_lock()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 { // Threads_lock scope
a61af66fc99e Initial load
duke
parents:
diff changeset
860 maxthreads = Threads::number_of_threads();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
861 threadsList = NEW_C_HEAP_ARRAY(JavaThread *, maxthreads, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
862 suspendedthreadcount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
863 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 if (tp->is_Compiler_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 // Only record ticks for active compiler threads
a61af66fc99e Initial load
duke
parents:
diff changeset
866 CompilerThread* cthread = (CompilerThread*)tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 if (cthread->task() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
868 // The compiler is active. If we need to access any of the fields
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // of the compiler task we should suspend the CompilerThread first.
a61af66fc99e Initial load
duke
parents:
diff changeset
870 FlatProfiler::compiler_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
871 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // First externally suspend all threads by marking each for
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // external suspension - so it will stop at its next transition
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // Then do a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
878 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (pp != NULL && pp->engaged) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 MutexLockerEx ml(tp->SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
881 if (!tp->is_external_suspend() && !tp->is_exiting()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 tp->set_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
883 threadsList[suspendedthreadcount++] = tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 // Suspend each thread. This call should just return
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // for any threads that have already self-suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Net result should be one safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
892 for (int j = 0; j < suspendedthreadcount; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 JavaThread *tp = threadsList[j];
a61af66fc99e Initial load
duke
parents:
diff changeset
894 if (tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 tp->java_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
898
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // We are responsible for resuming any thread on this list
a61af66fc99e Initial load
duke
parents:
diff changeset
900 for (int i = 0; i < suspendedthreadcount; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 JavaThread *tp = threadsList[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
902 if (tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
904 if (pp != NULL && pp->engaged) {
a61af66fc99e Initial load
duke
parents:
diff changeset
905 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
906 FlatProfiler::delivered_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 if (interval_expired) {
a61af66fc99e Initial load
duke
parents:
diff changeset
908 FlatProfiler::interval_record_thread(pp);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // This is the place where we check to see if a user thread is
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // blocked waiting for compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
912 if (tp->blocked_on_compilation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 pp->compiler_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
914 pp->interval_data_ref()->inc_compiling();
a61af66fc99e Initial load
duke
parents:
diff changeset
915 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
916 pp->record_tick(tp);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
919 MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
920 tp->java_resume();
a61af66fc99e Initial load
duke
parents:
diff changeset
921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 if (interval_expired) {
a61af66fc99e Initial load
duke
parents:
diff changeset
924 FlatProfiler::interval_print();
a61af66fc99e Initial load
duke
parents:
diff changeset
925 FlatProfiler::interval_reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // Couldn't get the threads lock, just record that rather than blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
929 FlatProfiler::threads_lock_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 void FlatProfilerTask::task() {
a61af66fc99e Initial load
duke
parents:
diff changeset
935 FlatProfiler::received_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 if (ProfileVM) {
a61af66fc99e Initial load
duke
parents:
diff changeset
938 FlatProfiler::record_vm_tick();
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 VM_Operation* op = VMThread::vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
942 if (op != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
943 FlatProfiler::record_vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
944 if (SafepointSynchronize::is_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948 FlatProfiler::record_thread_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
950
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
951 void ThreadProfiler::record_interpreted_tick(JavaThread* thread, frame fr, TickPosition where, int* ticks) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
952 FlatProfiler::all_int_ticks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
953 if (!FlatProfiler::full_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
954 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
956
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
957 if (!fr.is_interpreted_frame_valid(thread)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // tick came at a bad time
a61af66fc99e Initial load
duke
parents:
diff changeset
959 interpreter_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 FlatProfiler::interpreter_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
961 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
964 // The frame has been fully validated so we can trust the method and bci
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
965
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
966 Method* method = *fr.interpreter_frame_method_addr();
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
967
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 interpreted_update(method, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // update byte code table
a61af66fc99e Initial load
duke
parents:
diff changeset
971 InterpreterCodelet* desc = Interpreter::codelet_containing(fr.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
972 if (desc != NULL && desc->bytecode() >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 ticks[desc->bytecode()]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 void ThreadProfiler::record_compiled_tick(JavaThread* thread, frame fr, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
978 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
979 TickPosition localwhere = where;
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 FlatProfiler::all_comp_ticks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
982 if (!FlatProfiler::full_profile()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 CodeBlob* cb = fr.cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
985
a61af66fc99e Initial load
duke
parents:
diff changeset
986 // For runtime stubs, record as native rather than as compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
987 if (cb->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
988 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
989 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
990 cb = fr.cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
991 localwhere = tp_native;
a61af66fc99e Initial load
duke
parents:
diff changeset
992 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
993 Method* method = (cb->is_nmethod()) ? ((nmethod *)cb)->method() :
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
994 (Method*)NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
997 if (cb->is_runtime_stub())
a61af66fc99e Initial load
duke
parents:
diff changeset
998 runtime_stub_update(cb, name, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
999 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 unknown_compiled_update(cb, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 if (method->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 stub_update(method, name, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 compiled_update(method, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 extern "C" void find(int x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 void ThreadProfiler::record_tick_for_running_frame(JavaThread* thread, frame fr) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 196
diff changeset
1015 // The tick happened in real code -> non VM code
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 if (fr.is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 interval_data_ref()->inc_interpreted();
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
1018 record_interpreted_tick(thread, fr, tp_code, FlatProfiler::bytecode_ticks);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 if (CodeCache::contains(fr.pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 interval_data_ref()->inc_compiled();
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 PCRecorder::record(fr.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 record_compiled_tick(thread, fr, tp_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 if (VtableStubs::stub_containing(fr.pc()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 unknown_ticks_array[ut_vtable_stubs] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 frame caller = fr.profile_find_Java_sender_frame(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 if (caller.sp() != NULL && caller.pc() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 record_tick_for_calling_frame(thread, caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 unknown_ticks_array[ut_running_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 void ThreadProfiler::record_tick_for_calling_frame(JavaThread* thread, frame fr) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 196
diff changeset
1046 // The tick happened in VM code
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 interval_data_ref()->inc_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 if (fr.is_interpreted_frame()) {
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
1049 record_interpreted_tick(thread, fr, tp_native, FlatProfiler::bytecode_ticks_stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 if (CodeCache::contains(fr.pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 record_compiled_tick(thread, fr, tp_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1056
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 frame caller = fr.profile_find_Java_sender_frame(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 if (caller.sp() != NULL && caller.pc() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 record_tick_for_calling_frame(thread, caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 unknown_ticks_array[ut_calling_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 void ThreadProfiler::record_tick(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 FlatProfiler::all_ticks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 thread_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // Here's another way to track global state changes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 // When the class loader starts it marks the ThreadProfiler to tell it it is in the class loader
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // and we check that here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // This is more direct, and more than one thread can be in the class loader at a time,
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // but it does mean the class loader has to know about the profiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 if (region_flag[ThreadProfilerMark::classLoaderRegion]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 class_loader_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 FlatProfiler::class_loader_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 } else if (region_flag[ThreadProfilerMark::extraRegion]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 extra_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 FlatProfiler::extra_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // Note that the WatcherThread can now stop for safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 if (!thread->wait_for_ext_suspend_completion(SuspendRetryCount,
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 SuspendRetryDelay, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 unknown_ticks_array[ut_unknown_thread_state] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 frame fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 switch (thread->thread_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 case _thread_in_native:
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 case _thread_in_native_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 case _thread_in_vm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 case _thread_in_vm_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 if (thread->profile_last_Java_frame(&fr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 if (fr.is_runtime_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 record_tick_for_calling_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 // handle_special_runtime_exit_condition self-suspends threads in Java
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 case _thread_in_Java:
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 case _thread_in_Java_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 if (thread->profile_last_Java_frame(&fr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 if (fr.is_safepoint_blob_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 record_tick_for_running_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 case _thread_blocked:
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 case _thread_blocked_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 if (thread->osthread() && thread->osthread()->get_state() == RUNNABLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 if (thread->profile_last_Java_frame(&fr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 if (fr.is_safepoint_blob_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 record_tick_for_running_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 record_tick_for_calling_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 blocked_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 FlatProfiler::blocked_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 case _thread_uninitialized:
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 case _thread_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // not used, included for completeness
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 case _thread_new_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 unknown_ticks_array[ut_unknown_thread_state] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 void ThreadProfiler::engage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 engaged = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 void ThreadProfiler::disengage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 engaged = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1171
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 void ThreadProfiler::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 for (int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 table[index] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 thread_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 blocked_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 compiler_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 interpreter_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 for (int ut = 0; ut < ut_end; ut += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 unknown_ticks_array[ut] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 region_flag[ThreadProfilerMark::classLoaderRegion] = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 class_loader_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 region_flag[ThreadProfilerMark::extraRegion] = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 extra_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 interval_data_ref()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 void ThreadProfiler::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 if (table != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 for (int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 ProfilerNode* n = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 if (n != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 delete n;
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 void FlatProfiler::allocate_table() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 { // Bytecode table
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
1206 bytecode_ticks = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
1207 bytecode_ticks_stub = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 for(int index = 0; index < Bytecodes::number_of_codes; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 bytecode_ticks[index] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 bytecode_ticks_stub[index] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 if (ProfilerRecordPC) PCRecorder::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
1216 interval_data = NEW_C_HEAP_ARRAY(IntervalData, interval_print_size, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 FlatProfiler::interval_reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 void FlatProfiler::engage(JavaThread* mainThread, bool fullProfile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 full_profile_flag = fullProfile;
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 if (bytecode_ticks == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 allocate_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 if(ProfileVM && (vm_thread_profiler == NULL)){
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 vm_thread_profiler = new ThreadProfiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 if (task == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 task = new FlatProfilerTask(WatcherThread::delay_interval);
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 task->enroll();
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 if (mainThread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // When mainThread was created, it might not have a ThreadProfiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 ThreadProfiler* pp = mainThread->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if (pp == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 mainThread->set_thread_profiler(new ThreadProfiler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 pp->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 mainThread->get_thread_profiler()->engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // This is where we would assign thread_profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // if we wanted only one thread_profiler for all threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 thread_profiler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 void FlatProfiler::disengage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 if (!task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 task->disenroll();
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 delete task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 if (thread_profiler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 thread_profiler->disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 MutexLocker tl(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 pp->disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1268
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 void FlatProfiler::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 if (task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 class_loader_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 extra_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 received_gc_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 vm_operation_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 compiler_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 deopt_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 interpreter_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 blocked_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 unknown_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 received_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 delivered_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 bool FlatProfiler::is_active() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 return task != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 void FlatProfiler::print_byte_code_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 GrowableArray <ProfilerNode*>* array = new GrowableArray<ProfilerNode*>(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 tty->print_cr(" Bytecode ticks:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 for (int index = 0; index < Bytecodes::number_of_codes; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 if (FlatProfiler::bytecode_ticks[index] > 0 || FlatProfiler::bytecode_ticks_stub[index] > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 tty->print_cr(" %4d %4d = %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 FlatProfiler::bytecode_ticks[index],
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 FlatProfiler::bytecode_ticks_stub[index],
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 Bytecodes::name( (Bytecodes::Code) index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1306
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 void print_ticks(const char* title, int ticks, int total) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 if (ticks > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 tty->print("%5.1f%% %5d", ticks * 100.0 / total, ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 tty->fill_to(col3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 tty->print("%s", title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 void ThreadProfiler::print(const char* thread_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 MutexLocker ppl(ProfilePrint_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 int index = 0; // Declared outside for loops for portability
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 if (table == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1324
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 if (thread_ticks <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1328
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 const char* title = "too soon to tell";
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 double secs = timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
1331
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 GrowableArray <ProfilerNode*>* array = new GrowableArray<ProfilerNode*>(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 for(index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 for(ProfilerNode* node = table[index]; node; node = node->next())
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 array->append(node);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1337
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 array->sort(&ProfilerNode::compare);
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // compute total (sanity check)
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 int active =
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 class_loader_ticks +
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 compiler_ticks +
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 interpreter_ticks +
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 unknown_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 active += array->at(index)->ticks.total();
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 int total = active + blocked_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1350
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 tty->print_cr("Flat profile of %3.2f secs (%d total ticks): %s", secs, total, thread_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 if (total != thread_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 print_ticks("Lost ticks", thread_ticks-total, thread_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 // print interpreted methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 tick_counter interpreted_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 bool has_interpreted_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 int print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 if (n->is_interpreted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 interpreted_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 if (!has_interpreted_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 interpretedNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 has_interpreted_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 if (print_count++ < ProfilerNumberOfInterpretedMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 if (has_interpreted_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 if (print_count <= ProfilerNumberOfInterpretedMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 title = "Total interpreted";
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 title = "Total interpreted (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 interpretedNode::print_total(tty, &interpreted_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1384
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 // print compiled methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 tick_counter compiled_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 bool has_compiled_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 if (n->is_compiled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 compiled_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 if (!has_compiled_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 compiledNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 has_compiled_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 if (print_count++ < ProfilerNumberOfCompiledMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 if (has_compiled_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 if (print_count <= ProfilerNumberOfCompiledMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 title = "Total compiled";
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 title = "Total compiled (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 compiledNode::print_total(tty, &compiled_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // print stub methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 tick_counter stub_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 bool has_stub_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 if (n->is_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 stub_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 if (!has_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 stubNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 has_stub_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 if (print_count++ < ProfilerNumberOfStubMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 if (has_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 if (print_count <= ProfilerNumberOfStubMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 title = "Total stub";
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 title = "Total stub (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 stubNode::print_total(tty, &stub_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1438
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // print runtime stubs
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 tick_counter runtime_stub_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 bool has_runtime_stub_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 if (n->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 runtime_stub_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 if (!has_runtime_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 runtimeStubNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 has_runtime_stub_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 if (print_count++ < ProfilerNumberOfRuntimeStubNodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 if (has_runtime_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 if (print_count <= ProfilerNumberOfRuntimeStubNodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 title = "Total runtime stubs";
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 title = "Total runtime stubs (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 runtimeStubNode::print_total(tty, &runtime_stub_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1465
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 if (blocked_ticks + class_loader_ticks + interpreter_ticks + compiler_ticks + unknown_ticks() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 tty->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 tty->print_cr("Thread-local ticks:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 print_ticks("Blocked (of total)", blocked_ticks, total);
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 print_ticks("Class loader", class_loader_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 print_ticks("Extra", extra_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 print_ticks("Interpreter", interpreter_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 print_ticks("Compilation", compiler_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 print_ticks("Unknown: vtable stubs", unknown_ticks_array[ut_vtable_stubs], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 print_ticks("Unknown: null method", unknown_ticks_array[ut_null_method], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 print_ticks("Unknown: running frame", unknown_ticks_array[ut_running_frame], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 print_ticks("Unknown: calling frame", unknown_ticks_array[ut_calling_frame], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 print_ticks("Unknown: no pc", unknown_ticks_array[ut_no_pc], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 print_ticks("Unknown: no last frame", unknown_ticks_array[ut_no_last_Java_frame], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 print_ticks("Unknown: thread_state", unknown_ticks_array[ut_unknown_thread_state], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1483
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 tty->print_cr("Node area used: %dKb", (area_top - area_bottom) / 1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1489
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 ThreadProfiler::print_unknown(){
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 if (table == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1495
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 if (thread_ticks <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 } */
a61af66fc99e Initial load
duke
parents:
diff changeset
1500
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 void FlatProfiler::print(int unused) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 if (thread_profiler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 thread_profiler->print("All threads");
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 MutexLocker tl(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 pp->print(tp->get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1514
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 if (ProfilerPrintByteCodeStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 print_byte_code_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1518
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 if (non_method_ticks() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 tty->print_cr("Global summary of %3.2f seconds:", timer.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 print_ticks("Received ticks", received_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 print_ticks("Received GC ticks", received_gc_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 print_ticks("Compilation", compiler_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 print_ticks("Deoptimization", deopt_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 print_ticks("Other VM operations", vm_operation_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 print_ticks("Blocked ticks", blocked_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 print_ticks("Threads_lock blocks", threads_lock_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 print_ticks("Delivered ticks", delivered_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 print_ticks("All ticks", all_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 print_ticks("Class loader", class_loader_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 print_ticks("Extra ", extra_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 print_ticks("Interpreter", interpreter_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 print_ticks("Unknown code", unknown_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1538
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 PCRecorder::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 if(ProfileVM){
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 vm_thread_profiler->print("VM Thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1546
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 void IntervalData::print_header(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 st->print("i/c/n/g");
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1550
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 void IntervalData::print_data(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 st->print("%d/%d/%d/%d", interpreted(), compiled(), native(), compiling());
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 void FlatProfiler::interval_record_thread(ThreadProfiler* tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 IntervalData id = tp->interval_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 int total = id.total();
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 tp->interval_data_ref()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1559
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 // Insertion sort the data, if it's relevant.
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 for (int i = 0; i < interval_print_size; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 if (total > interval_data[i].total()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 for (int j = interval_print_size - 1; j > i; j -= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 interval_data[j] = interval_data[j-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 interval_data[i] = id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1571
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 void FlatProfiler::interval_print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 if ((interval_data[0].total() > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 tty->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 IntervalData::print_header(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 for (int i = 0; i < interval_print_size; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 if (interval_data[i].total() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 tty->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 interval_data[i].print_data(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1586
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 void FlatProfiler::interval_reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 for (int i = 0; i < interval_print_size; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 interval_data[i].reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1592
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 void ThreadProfiler::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 if (table == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1595
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 for(int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 for(ProfilerNode* node = table[index]; node; node = node->next())
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 node->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1601
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 void FlatProfiler::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 if (thread_profiler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 thread_profiler->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 pp->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }