annotate src/share/vm/runtime/fprofiler.cpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents 491de79915eb
children 78bbf4d43a14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 6725
diff changeset
2 * Copyright (c) 1997, 2013, 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
12146
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 10105
diff changeset
267 void* operator new(size_t size, ThreadProfiler* tp) throw();
0
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
12146
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 10105
diff changeset
376 void* ProfilerNode::operator new(size_t size, ThreadProfiler* tp) throw() {
0
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);
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 6725
diff changeset
424 MethodCounters* mcs = method()->method_counters();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 6725
diff changeset
425 if (Verbose && mcs != NULL) mcs->invocation_counter()->print_short();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427 };
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 class compiledNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
431 Method* _method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
432 oop _class_loader; // needed to keep metadata for the method alive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
434 compiledNode(Method* method, TickPosition where) : ProfilerNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
435 _method = method;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
436 _class_loader = method->method_holder()->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
441 bool compiled_match(Method* m) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
442 return _method == m;
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
445 Method* method() { return _method; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 void oops_do(OopClosure* f) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
448 f->do_oop(&_class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 st->print("%11s", "Compiled");
a61af66fc99e Initial load
duke
parents:
diff changeset
454 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 ProfilerNode::print_method_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 };
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 class stubNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
468 Method* _method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
469 oop _class_loader; // needed to keep metadata for the method alive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
470 const char* _symbol; // The name of the nearest VM symbol (for +ProfileVM). Points to a unique string
a61af66fc99e Initial load
duke
parents:
diff changeset
471 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
472 stubNode(Method* method, const char* name, TickPosition where) : ProfilerNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
473 _method = method;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
474 _class_loader = method->method_holder()->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
475 _symbol = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 bool is_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
480
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
481 void oops_do(OopClosure* f) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
482 f->do_oop(&_class_loader);
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
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
485 bool stub_match(Method* m, const char* name) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
486 return (_method == m) && (_symbol == name);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
489 Method* method() { return _method; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
493 st->print("%11s", "Stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
494 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 ProfilerNode::print_method_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void print_symbol_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 if(_symbol) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 st->print(" (%s)", _symbol);
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
a61af66fc99e Initial load
duke
parents:
diff changeset
513 class adapterNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
515 adapterNode(TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 bool adapter_match() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
522 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
533 st->print("%s", "adapters");
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535 };
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 class runtimeStubNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
539 const CodeBlob* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
540 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
541 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
542 runtimeStubNode(const CodeBlob* stub, const char* name, TickPosition where) : ProfilerNode(), _stub(stub), _symbol(name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
543 assert(stub->is_runtime_stub(), "wrong code blob");
a61af66fc99e Initial load
duke
parents:
diff changeset
544 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 bool is_runtime_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 bool runtimeStub_match(const CodeBlob* stub, const char* name) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 assert(stub->is_runtime_stub(), "wrong code blob");
a61af66fc99e Initial load
duke
parents:
diff changeset
551 return ((RuntimeStub*)_stub)->entry_point() == ((RuntimeStub*)stub)->entry_point() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
552 (_symbol == name);
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
555 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 static void print_title(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 st->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 st->print("%11s", "Runtime stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
560 ProfilerNode::print_title(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
568 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 st->print("%s", ((RuntimeStub*)_stub)->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
573 print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 void print_symbol_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 if(_symbol) {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 st->print(" (%s)", _symbol);
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
a61af66fc99e Initial load
duke
parents:
diff changeset
584 class unknown_compiledNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
585 const char *_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
586 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
587 unknown_compiledNode(const CodeBlob* cb, TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if ( cb->is_buffer_blob() )
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _name = ((BufferBlob*)cb)->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
590 else
a61af66fc99e Initial load
duke
parents:
diff changeset
591 _name = ((SingletonBlob*)cb)->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
592 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 bool unknown_compiled_match(const CodeBlob* cb) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if ( cb->is_buffer_blob() )
a61af66fc99e Initial load
duke
parents:
diff changeset
598 return !strcmp(((BufferBlob*)cb)->name(), _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
599 else
a61af66fc99e Initial load
duke
parents:
diff changeset
600 return !strcmp(((SingletonBlob*)cb)->name(), _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
603 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 st->print("%s", _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616 };
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 class vmNode : public ProfilerNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 const char* _name; // "optional" name obtained by os means such as dll lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
621 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
622 vmNode(const TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
623 _name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
624 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 vmNode(const char* name, const TickPosition where) : ProfilerNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 _name = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 const char *name() const { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
633 bool is_compiled() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 bool vm_match(const char* name) const { return strcmp(name, _name) == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
636
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
637 Method* method() { return NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 static int hash(const char* name){
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // Compute a simple hash
a61af66fc99e Initial load
duke
parents:
diff changeset
641 const char* cp = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
642 int h = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if(name != NULL){
a61af66fc99e Initial load
duke
parents:
diff changeset
645 while(*cp != '\0'){
a61af66fc99e Initial load
duke
parents:
diff changeset
646 h = (h << 1) ^ *cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650 return h;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 void oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
654 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 void print(outputStream* st, int total_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ProfilerNode::print(st, total_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 void print_method_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 if(_name==NULL){
a61af66fc99e Initial load
duke
parents:
diff changeset
663 st->print("%s", "unknown code");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 st->print("%s", _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669 };
a61af66fc99e Initial load
duke
parents:
diff changeset
670
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
671 void ThreadProfiler::interpreted_update(Method* method, TickPosition where) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
672 int index = entry(ProfilerNode::hash(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
673 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 table[index] = new (this) interpretedNode(method, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
675 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
677 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 if (node->interpreted_match(method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
680 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684 prev->set_next(new (this) interpretedNode(method, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
688 void ThreadProfiler::compiled_update(Method* method, TickPosition where) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
689 int index = entry(ProfilerNode::hash(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
690 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 table[index] = new (this) compiledNode(method, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
692 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
694 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 if (node->compiled_match(method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
697 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
701 prev->set_next(new (this) compiledNode(method, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
704
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
705 void ThreadProfiler::stub_update(Method* method, const char* name, TickPosition where) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
706 int index = entry(ProfilerNode::hash(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
707 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 table[index] = new (this) stubNode(method, name, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
711 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 if (node->stub_match(method, name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
716 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 prev->set_next(new (this) stubNode(method, name, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 void ThreadProfiler::adapter_update(TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
725 table[index] = new (this) adapterNode(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
726 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
727 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
728 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 if (node->adapter_match()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
731 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
733 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
735 prev->set_next(new (this) adapterNode(where));
a61af66fc99e Initial load
duke
parents:
diff changeset
736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 void ThreadProfiler::runtime_stub_update(const CodeBlob* stub, const char* name, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 table[index] = new (this) runtimeStubNode(stub, name, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
743 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
745 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 if (node->runtimeStub_match(stub, name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
748 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
752 prev->set_next(new (this) runtimeStubNode(stub, name, where));
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
a61af66fc99e Initial load
duke
parents:
diff changeset
757 void ThreadProfiler::unknown_compiled_update(const CodeBlob* cb, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
759 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 table[index] = new (this) unknown_compiledNode(cb, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
761 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
762 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
763 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 if (node->unknown_compiled_match(cb)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
766 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
768 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770 prev->set_next(new (this) unknown_compiledNode(cb, where));
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 void ThreadProfiler::vm_update(TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 vm_update(NULL, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778 void ThreadProfiler::vm_update(const char* name, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
779 int index = entry(vmNode::hash(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
780 assert(index >= 0, "Must be positive");
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // Note that we call strdup below since the symbol may be resource allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if (!table[index]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 table[index] = new (this) vmNode(os::strdup(name), where);
a61af66fc99e Initial load
duke
parents:
diff changeset
784 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 ProfilerNode* prev = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
786 for(ProfilerNode* node = prev; node; node = node->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (((vmNode *)node)->vm_match(name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 node->update(where);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
791 prev = node;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793 prev->set_next(new (this) vmNode(os::strdup(name), where));
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
a61af66fc99e Initial load
duke
parents:
diff changeset
798 class FlatProfilerTask : public PeriodicTask {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
800 FlatProfilerTask(int interval_time) : PeriodicTask(interval_time) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
801 void task();
a61af66fc99e Initial load
duke
parents:
diff changeset
802 };
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 void FlatProfiler::record_vm_operation() {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 if (Universe::heap()->is_gc_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 FlatProfiler::received_gc_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 if (DeoptimizationMarker::is_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 FlatProfiler::deopt_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
812 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 FlatProfiler::vm_operation_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 void FlatProfiler::record_vm_tick() {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // Profile the VM Thread itself if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // This is done without getting the Threads_lock and we can go deep
a61af66fc99e Initial load
duke
parents:
diff changeset
821 // inside Safepoint, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if( ProfileVM ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 ExtendedPC epc;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 char buf[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
827 buf[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 vm_thread_profiler->inc_thread_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // Get a snapshot of a current VMThread pc (and leave it running!)
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // The call may fail if, for instance the VM thread is interrupted while
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // holding the Interrupt_lock or for other reasons.
a61af66fc99e Initial load
duke
parents:
diff changeset
834 epc = os::get_thread_pc(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
835 if(epc.pc() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 if (os::dll_address_to_function_name(epc.pc(), buf, sizeof(buf), NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
837 name = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
841 vm_thread_profiler->vm_update(name, tp_native);
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
a61af66fc99e Initial load
duke
parents:
diff changeset
846 void FlatProfiler::record_thread_ticks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 int maxthreads, suspendedthreadcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 JavaThread** threadsList;
a61af66fc99e Initial load
duke
parents:
diff changeset
850 bool interval_expired = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 if (ProfileIntervals &&
a61af66fc99e Initial load
duke
parents:
diff changeset
853 (FlatProfiler::received_ticks >= interval_ticks_previous + ProfileIntervalsTicks)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
854 interval_expired = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
855 interval_ticks_previous = FlatProfiler::received_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // Try not to wait for the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
859 if (Threads_lock->try_lock()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
860 { // Threads_lock scope
a61af66fc99e Initial load
duke
parents:
diff changeset
861 maxthreads = Threads::number_of_threads();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
862 threadsList = NEW_C_HEAP_ARRAY(JavaThread *, maxthreads, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863 suspendedthreadcount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
864 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 if (tp->is_Compiler_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // Only record ticks for active compiler threads
a61af66fc99e Initial load
duke
parents:
diff changeset
867 CompilerThread* cthread = (CompilerThread*)tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
868 if (cthread->task() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // The compiler is active. If we need to access any of the fields
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // of the compiler task we should suspend the CompilerThread first.
a61af66fc99e Initial load
duke
parents:
diff changeset
871 FlatProfiler::compiler_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // First externally suspend all threads by marking each for
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // external suspension - so it will stop at its next transition
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // Then do a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
879 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
880 if (pp != NULL && pp->engaged) {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 MutexLockerEx ml(tp->SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 if (!tp->is_external_suspend() && !tp->is_exiting()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 tp->set_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
884 threadsList[suspendedthreadcount++] = tp;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // Suspend each thread. This call should just return
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // for any threads that have already self-suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // Net result should be one safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
893 for (int j = 0; j < suspendedthreadcount; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
894 JavaThread *tp = threadsList[j];
a61af66fc99e Initial load
duke
parents:
diff changeset
895 if (tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
896 tp->java_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // We are responsible for resuming any thread on this list
a61af66fc99e Initial load
duke
parents:
diff changeset
901 for (int i = 0; i < suspendedthreadcount; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
902 JavaThread *tp = threadsList[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
903 if (tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
905 if (pp != NULL && pp->engaged) {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 FlatProfiler::delivered_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
908 if (interval_expired) {
a61af66fc99e Initial load
duke
parents:
diff changeset
909 FlatProfiler::interval_record_thread(pp);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // This is the place where we check to see if a user thread is
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // blocked waiting for compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
913 if (tp->blocked_on_compilation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 pp->compiler_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
915 pp->interval_data_ref()->inc_compiling();
a61af66fc99e Initial load
duke
parents:
diff changeset
916 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
917 pp->record_tick(tp);
a61af66fc99e Initial load
duke
parents:
diff changeset
918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
920 MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
921 tp->java_resume();
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924 if (interval_expired) {
a61af66fc99e Initial load
duke
parents:
diff changeset
925 FlatProfiler::interval_print();
a61af66fc99e Initial load
duke
parents:
diff changeset
926 FlatProfiler::interval_reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
12148
522d69638aa8 6991327: using -Xprof trigger native memory leak
zgu
parents: 10105
diff changeset
928
522d69638aa8 6991327: using -Xprof trigger native memory leak
zgu
parents: 10105
diff changeset
929 FREE_C_HEAP_ARRAY(JavaThread *, threadsList, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
930 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // Couldn't get the threads lock, just record that rather than blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
932 FlatProfiler::threads_lock_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 void FlatProfilerTask::task() {
a61af66fc99e Initial load
duke
parents:
diff changeset
938 FlatProfiler::received_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940 if (ProfileVM) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 FlatProfiler::record_vm_tick();
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 VM_Operation* op = VMThread::vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
945 if (op != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 FlatProfiler::record_vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
947 if (SafepointSynchronize::is_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
951 FlatProfiler::record_thread_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
954 void ThreadProfiler::record_interpreted_tick(JavaThread* thread, frame fr, TickPosition where, int* ticks) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
955 FlatProfiler::all_int_ticks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 if (!FlatProfiler::full_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
960 if (!fr.is_interpreted_frame_valid(thread)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
961 // tick came at a bad time
a61af66fc99e Initial load
duke
parents:
diff changeset
962 interpreter_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
963 FlatProfiler::interpreter_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
964 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
967 // 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
968
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
969 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
970
0
a61af66fc99e Initial load
duke
parents:
diff changeset
971 interpreted_update(method, where);
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // update byte code table
a61af66fc99e Initial load
duke
parents:
diff changeset
974 InterpreterCodelet* desc = Interpreter::codelet_containing(fr.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
975 if (desc != NULL && desc->bytecode() >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
976 ticks[desc->bytecode()]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 void ThreadProfiler::record_compiled_tick(JavaThread* thread, frame fr, TickPosition where) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
982 TickPosition localwhere = where;
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 FlatProfiler::all_comp_ticks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
985 if (!FlatProfiler::full_profile()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987 CodeBlob* cb = fr.cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
988
a61af66fc99e Initial load
duke
parents:
diff changeset
989 // For runtime stubs, record as native rather than as compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
990 if (cb->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
991 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
992 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
993 cb = fr.cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
994 localwhere = tp_native;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
996 Method* method = (cb->is_nmethod()) ? ((nmethod *)cb)->method() :
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
997 (Method*)NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
998
a61af66fc99e Initial load
duke
parents:
diff changeset
999 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 if (cb->is_runtime_stub())
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 runtime_stub_update(cb, name, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 unknown_compiled_update(cb, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 if (method->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 stub_update(method, name, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 compiled_update(method, localwhere);
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 extern "C" void find(int x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 void ThreadProfiler::record_tick_for_running_frame(JavaThread* thread, frame fr) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 196
diff changeset
1018 // The tick happened in real code -> non VM code
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 if (fr.is_interpreted_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 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
1021 record_interpreted_tick(thread, fr, tp_code, FlatProfiler::bytecode_ticks);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 if (CodeCache::contains(fr.pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 interval_data_ref()->inc_compiled();
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 PCRecorder::record(fr.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 record_compiled_tick(thread, fr, tp_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 if (VtableStubs::stub_containing(fr.pc()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 unknown_ticks_array[ut_vtable_stubs] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 frame caller = fr.profile_find_Java_sender_frame(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 if (caller.sp() != NULL && caller.pc() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 record_tick_for_calling_frame(thread, caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 unknown_ticks_array[ut_running_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 void ThreadProfiler::record_tick_for_calling_frame(JavaThread* thread, frame fr) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 196
diff changeset
1049 // The tick happened in VM code
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 interval_data_ref()->inc_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 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
1052 record_interpreted_tick(thread, fr, tp_native, FlatProfiler::bytecode_ticks_stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 if (CodeCache::contains(fr.pc())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 record_compiled_tick(thread, fr, tp_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 frame caller = fr.profile_find_Java_sender_frame(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 if (caller.sp() != NULL && caller.pc() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 record_tick_for_calling_frame(thread, caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 unknown_ticks_array[ut_calling_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 void ThreadProfiler::record_tick(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 FlatProfiler::all_ticks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 thread_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // Here's another way to track global state changes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // 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
1077 // and we check that here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // 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
1079 // but it does mean the class loader has to know about the profiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 if (region_flag[ThreadProfilerMark::classLoaderRegion]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 class_loader_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 FlatProfiler::class_loader_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 } else if (region_flag[ThreadProfilerMark::extraRegion]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 extra_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 FlatProfiler::extra_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // Note that the WatcherThread can now stop for safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 if (!thread->wait_for_ext_suspend_completion(SuspendRetryCount,
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 SuspendRetryDelay, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 unknown_ticks_array[ut_unknown_thread_state] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 frame fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 switch (thread->thread_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 case _thread_in_native:
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 case _thread_in_native_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 case _thread_in_vm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 case _thread_in_vm_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 if (thread->profile_last_Java_frame(&fr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 if (fr.is_runtime_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 record_tick_for_calling_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // handle_special_runtime_exit_condition self-suspends threads in Java
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 case _thread_in_Java:
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 case _thread_in_Java_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 if (thread->profile_last_Java_frame(&fr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 if (fr.is_safepoint_blob_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 record_tick_for_running_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 case _thread_blocked:
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 case _thread_blocked_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (thread->osthread() && thread->osthread()->get_state() == RUNNABLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 if (thread->profile_last_Java_frame(&fr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 if (fr.is_safepoint_blob_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 fr = fr.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 record_tick_for_running_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 record_tick_for_calling_frame(thread, fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 blocked_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 FlatProfiler::blocked_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 case _thread_uninitialized:
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 case _thread_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // not used, included for completeness
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 case _thread_new_trans:
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 unknown_ticks_array[ut_no_last_Java_frame] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 unknown_ticks_array[ut_unknown_thread_state] += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 FlatProfiler::unknown_ticks += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 void ThreadProfiler::engage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 engaged = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 void ThreadProfiler::disengage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 engaged = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 void ThreadProfiler::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 for (int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 table[index] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 thread_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 blocked_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 compiler_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 interpreter_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 for (int ut = 0; ut < ut_end; ut += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 unknown_ticks_array[ut] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 region_flag[ThreadProfilerMark::classLoaderRegion] = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 class_loader_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 region_flag[ThreadProfilerMark::extraRegion] = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 extra_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 interval_data_ref()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 void ThreadProfiler::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 if (table != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 for (int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 ProfilerNode* n = table[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 if (n != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 delete n;
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 void FlatProfiler::allocate_table() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 { // Bytecode table
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
1209 bytecode_ticks = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
1210 bytecode_ticks_stub = NEW_C_HEAP_ARRAY(int, Bytecodes::number_of_codes, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 for(int index = 0; index < Bytecodes::number_of_codes; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 bytecode_ticks[index] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 bytecode_ticks_stub[index] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 if (ProfilerRecordPC) PCRecorder::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 2426
diff changeset
1219 interval_data = NEW_C_HEAP_ARRAY(IntervalData, interval_print_size, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 FlatProfiler::interval_reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 void FlatProfiler::engage(JavaThread* mainThread, bool fullProfile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 full_profile_flag = fullProfile;
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 if (bytecode_ticks == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 allocate_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 if(ProfileVM && (vm_thread_profiler == NULL)){
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 vm_thread_profiler = new ThreadProfiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 if (task == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 task = new FlatProfilerTask(WatcherThread::delay_interval);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 task->enroll();
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if (mainThread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // When mainThread was created, it might not have a ThreadProfiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 ThreadProfiler* pp = mainThread->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 if (pp == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 mainThread->set_thread_profiler(new ThreadProfiler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 pp->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 mainThread->get_thread_profiler()->engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // This is where we would assign thread_profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // if we wanted only one thread_profiler for all threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 thread_profiler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 void FlatProfiler::disengage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 if (!task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 task->disenroll();
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 delete task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 if (thread_profiler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 thread_profiler->disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 MutexLocker tl(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 pp->disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1271
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 void FlatProfiler::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 if (task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 class_loader_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 extra_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 received_gc_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 vm_operation_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 compiler_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 deopt_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 interpreter_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 blocked_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 unknown_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 received_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 delivered_ticks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 bool FlatProfiler::is_active() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 return task != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 void FlatProfiler::print_byte_code_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 GrowableArray <ProfilerNode*>* array = new GrowableArray<ProfilerNode*>(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 tty->print_cr(" Bytecode ticks:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 for (int index = 0; index < Bytecodes::number_of_codes; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (FlatProfiler::bytecode_ticks[index] > 0 || FlatProfiler::bytecode_ticks_stub[index] > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 tty->print_cr(" %4d %4d = %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 FlatProfiler::bytecode_ticks[index],
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 FlatProfiler::bytecode_ticks_stub[index],
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 Bytecodes::name( (Bytecodes::Code) index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 void print_ticks(const char* title, int ticks, int total) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 if (ticks > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 tty->print("%5.1f%% %5d", ticks * 100.0 / total, ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 tty->fill_to(col3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 tty->print("%s", title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 void ThreadProfiler::print(const char* thread_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 MutexLocker ppl(ProfilePrint_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 int index = 0; // Declared outside for loops for portability
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 if (table == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1327
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 if (thread_ticks <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1331
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 const char* title = "too soon to tell";
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 double secs = timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
1334
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 GrowableArray <ProfilerNode*>* array = new GrowableArray<ProfilerNode*>(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 for(index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 for(ProfilerNode* node = table[index]; node; node = node->next())
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 array->append(node);
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1340
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 array->sort(&ProfilerNode::compare);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 // compute total (sanity check)
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 int active =
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 class_loader_ticks +
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 compiler_ticks +
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 interpreter_ticks +
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 unknown_ticks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 active += array->at(index)->ticks.total();
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 int total = active + blocked_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 tty->print_cr("Flat profile of %3.2f secs (%d total ticks): %s", secs, total, thread_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 if (total != thread_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 print_ticks("Lost ticks", thread_ticks-total, thread_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // print interpreted methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 tick_counter interpreted_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 bool has_interpreted_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 int print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 if (n->is_interpreted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 interpreted_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 if (!has_interpreted_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 interpretedNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 has_interpreted_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 if (print_count++ < ProfilerNumberOfInterpretedMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 if (has_interpreted_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 if (print_count <= ProfilerNumberOfInterpretedMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 title = "Total interpreted";
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 title = "Total interpreted (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 interpretedNode::print_total(tty, &interpreted_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // print compiled methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 tick_counter compiled_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 bool has_compiled_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 if (n->is_compiled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 compiled_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 if (!has_compiled_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 compiledNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 has_compiled_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 if (print_count++ < ProfilerNumberOfCompiledMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 if (has_compiled_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 if (print_count <= ProfilerNumberOfCompiledMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 title = "Total compiled";
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 title = "Total compiled (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 compiledNode::print_total(tty, &compiled_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1414
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 // print stub methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 tick_counter stub_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 bool has_stub_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 if (n->is_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 stub_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 if (!has_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 stubNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 has_stub_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 if (print_count++ < ProfilerNumberOfStubMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 if (has_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 if (print_count <= ProfilerNumberOfStubMethods) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 title = "Total stub";
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 title = "Total stub (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 stubNode::print_total(tty, &stub_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1441
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 // print runtime stubs
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 tick_counter runtime_stub_ticks;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 bool has_runtime_stub_ticks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 print_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 for (index = 0; index < array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 ProfilerNode* n = array->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 if (n->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 runtime_stub_ticks.add(&n->ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 if (!has_runtime_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 runtimeStubNode::print_title(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 has_runtime_stub_ticks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 if (print_count++ < ProfilerNumberOfRuntimeStubNodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 n->print(tty, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 if (has_runtime_stub_ticks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 if (print_count <= ProfilerNumberOfRuntimeStubNodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 title = "Total runtime stubs";
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 title = "Total runtime stubs (including elided)";
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 runtimeStubNode::print_total(tty, &runtime_stub_ticks, active, title);
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 if (blocked_ticks + class_loader_ticks + interpreter_ticks + compiler_ticks + unknown_ticks() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 tty->fill_to(col1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 tty->print_cr("Thread-local ticks:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 print_ticks("Blocked (of total)", blocked_ticks, total);
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 print_ticks("Class loader", class_loader_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 print_ticks("Extra", extra_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 print_ticks("Interpreter", interpreter_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 print_ticks("Compilation", compiler_ticks, active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 print_ticks("Unknown: vtable stubs", unknown_ticks_array[ut_vtable_stubs], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 print_ticks("Unknown: null method", unknown_ticks_array[ut_null_method], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 print_ticks("Unknown: running frame", unknown_ticks_array[ut_running_frame], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 print_ticks("Unknown: calling frame", unknown_ticks_array[ut_calling_frame], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 print_ticks("Unknown: no pc", unknown_ticks_array[ut_no_pc], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 print_ticks("Unknown: no last frame", unknown_ticks_array[ut_no_last_Java_frame], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 print_ticks("Unknown: thread_state", unknown_ticks_array[ut_unknown_thread_state], active);
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 tty->print_cr("Node area used: %dKb", (area_top - area_bottom) / 1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1492
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 ThreadProfiler::print_unknown(){
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 if (table == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 if (thread_ticks <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 } */
a61af66fc99e Initial load
duke
parents:
diff changeset
1503
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 void FlatProfiler::print(int unused) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 if (thread_profiler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 thread_profiler->print("All threads");
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 MutexLocker tl(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 pp->print(tp->get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1517
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 if (ProfilerPrintByteCodeStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 print_byte_code_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1521
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 if (non_method_ticks() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 tty->print_cr("Global summary of %3.2f seconds:", timer.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 print_ticks("Received ticks", received_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 print_ticks("Received GC ticks", received_gc_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 print_ticks("Compilation", compiler_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 print_ticks("Deoptimization", deopt_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 print_ticks("Other VM operations", vm_operation_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 print_ticks("Blocked ticks", blocked_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 print_ticks("Threads_lock blocks", threads_lock_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 print_ticks("Delivered ticks", delivered_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 print_ticks("All ticks", all_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 print_ticks("Class loader", class_loader_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 print_ticks("Extra ", extra_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 print_ticks("Interpreter", interpreter_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 print_ticks("Unknown code", unknown_ticks, received_ticks);
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1541
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 PCRecorder::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
1543
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 if(ProfileVM){
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 vm_thread_profiler->print("VM Thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1549
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 void IntervalData::print_header(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 st->print("i/c/n/g");
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1553
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 void IntervalData::print_data(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 st->print("%d/%d/%d/%d", interpreted(), compiled(), native(), compiling());
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1557
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 void FlatProfiler::interval_record_thread(ThreadProfiler* tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 IntervalData id = tp->interval_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 int total = id.total();
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 tp->interval_data_ref()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1562
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 // Insertion sort the data, if it's relevant.
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 for (int i = 0; i < interval_print_size; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 if (total > interval_data[i].total()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 for (int j = interval_print_size - 1; j > i; j -= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 interval_data[j] = interval_data[j-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 interval_data[i] = id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1574
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 void FlatProfiler::interval_print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 if ((interval_data[0].total() > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 tty->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 IntervalData::print_header(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 for (int i = 0; i < interval_print_size; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 if (interval_data[i].total() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 tty->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 interval_data[i].print_data(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1589
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 void FlatProfiler::interval_reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 for (int i = 0; i < interval_print_size; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 interval_data[i].reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1595
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 void ThreadProfiler::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 if (table == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1598
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 for(int index = 0; index < table_size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 for(ProfilerNode* node = table[index]; node; node = node->next())
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 node->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1604
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 void FlatProfiler::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 if (thread_profiler != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 thread_profiler->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 for (JavaThread* tp = Threads::first(); tp != NULL; tp = tp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 ThreadProfiler* pp = tp->get_thread_profiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 pp->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 }