31 #include "compiler/compilerOracle.hpp" |
31 #include "compiler/compilerOracle.hpp" |
32 #include "interpreter/bytecodeHistogram.hpp" |
32 #include "interpreter/bytecodeHistogram.hpp" |
33 #include "memory/genCollectedHeap.hpp" |
33 #include "memory/genCollectedHeap.hpp" |
34 #include "memory/oopFactory.hpp" |
34 #include "memory/oopFactory.hpp" |
35 #include "memory/universe.hpp" |
35 #include "memory/universe.hpp" |
36 #include "oops/constantPoolOop.hpp" |
36 #include "oops/constantPool.hpp" |
37 #include "oops/generateOopMap.hpp" |
37 #include "oops/generateOopMap.hpp" |
38 #include "oops/instanceKlass.hpp" |
38 #include "oops/instanceKlass.hpp" |
39 #include "oops/instanceKlassKlass.hpp" |
|
40 #include "oops/instanceOop.hpp" |
39 #include "oops/instanceOop.hpp" |
41 #include "oops/methodOop.hpp" |
40 #include "oops/method.hpp" |
42 #include "oops/objArrayOop.hpp" |
41 #include "oops/objArrayOop.hpp" |
43 #include "oops/oop.inline.hpp" |
42 #include "oops/oop.inline.hpp" |
44 #include "oops/symbol.hpp" |
43 #include "oops/symbol.hpp" |
45 #include "prims/jvmtiExport.hpp" |
44 #include "prims/jvmtiExport.hpp" |
46 #include "runtime/aprofiler.hpp" |
45 #include "runtime/aprofiler.hpp" |
113 |
112 |
114 #ifndef PRODUCT |
113 #ifndef PRODUCT |
115 |
114 |
116 // Statistics printing (method invocation histogram) |
115 // Statistics printing (method invocation histogram) |
117 |
116 |
118 GrowableArray<methodOop>* collected_invoked_methods; |
117 GrowableArray<Method*>* collected_invoked_methods; |
119 |
118 |
120 void collect_invoked_methods(methodOop m) { |
119 void collect_invoked_methods(Method* m) { |
121 if (m->invocation_count() + m->compiled_invocation_count() >= 1 ) { |
120 if (m->invocation_count() + m->compiled_invocation_count() >= 1 ) { |
122 collected_invoked_methods->push(m); |
121 collected_invoked_methods->push(m); |
123 } |
122 } |
124 } |
123 } |
125 |
124 |
126 |
125 |
127 GrowableArray<methodOop>* collected_profiled_methods; |
126 GrowableArray<Method*>* collected_profiled_methods; |
128 |
127 |
129 void collect_profiled_methods(methodOop m) { |
128 void collect_profiled_methods(Method* m) { |
130 methodHandle mh(Thread::current(), m); |
129 Thread* thread = Thread::current(); |
|
130 // This HandleMark prevents a huge amount of handles from being added |
|
131 // to the metadata_handles() array on the thread. |
|
132 HandleMark hm(thread); |
|
133 methodHandle mh(thread, m); |
131 if ((m->method_data() != NULL) && |
134 if ((m->method_data() != NULL) && |
132 (PrintMethodData || CompilerOracle::should_print(mh))) { |
135 (PrintMethodData || CompilerOracle::should_print(mh))) { |
133 collected_profiled_methods->push(m); |
136 collected_profiled_methods->push(m); |
134 } |
137 } |
135 } |
138 } |
136 |
139 |
137 |
140 |
138 int compare_methods(methodOop* a, methodOop* b) { |
141 int compare_methods(Method** a, Method** b) { |
139 // %%% there can be 32-bit overflow here |
142 // %%% there can be 32-bit overflow here |
140 return ((*b)->invocation_count() + (*b)->compiled_invocation_count()) |
143 return ((*b)->invocation_count() + (*b)->compiled_invocation_count()) |
141 - ((*a)->invocation_count() + (*a)->compiled_invocation_count()); |
144 - ((*a)->invocation_count() + (*a)->compiled_invocation_count()); |
142 } |
145 } |
143 |
146 |
144 |
147 |
145 void print_method_invocation_histogram() { |
148 void print_method_invocation_histogram() { |
146 ResourceMark rm; |
149 ResourceMark rm; |
147 HandleMark hm; |
150 HandleMark hm; |
148 collected_invoked_methods = new GrowableArray<methodOop>(1024); |
151 collected_invoked_methods = new GrowableArray<Method*>(1024); |
149 SystemDictionary::methods_do(collect_invoked_methods); |
152 SystemDictionary::methods_do(collect_invoked_methods); |
150 collected_invoked_methods->sort(&compare_methods); |
153 collected_invoked_methods->sort(&compare_methods); |
151 // |
154 // |
152 tty->cr(); |
155 tty->cr(); |
153 tty->print_cr("Histogram Over MethodOop Invocation Counters (cutoff = %d):", MethodHistogramCutoff); |
156 tty->print_cr("Histogram Over MethodOop Invocation Counters (cutoff = %d):", MethodHistogramCutoff); |
154 tty->cr(); |
157 tty->cr(); |
155 tty->print_cr("____Count_(I+C)____Method________________________Module_________________"); |
158 tty->print_cr("____Count_(I+C)____Method________________________Module_________________"); |
156 unsigned total = 0, int_total = 0, comp_total = 0, static_total = 0, final_total = 0, |
159 unsigned total = 0, int_total = 0, comp_total = 0, static_total = 0, final_total = 0, |
157 synch_total = 0, nativ_total = 0, acces_total = 0; |
160 synch_total = 0, nativ_total = 0, acces_total = 0; |
158 for (int index = 0; index < collected_invoked_methods->length(); index++) { |
161 for (int index = 0; index < collected_invoked_methods->length(); index++) { |
159 methodOop m = collected_invoked_methods->at(index); |
162 Method* m = collected_invoked_methods->at(index); |
160 int c = m->invocation_count() + m->compiled_invocation_count(); |
163 int c = m->invocation_count() + m->compiled_invocation_count(); |
161 if (c >= MethodHistogramCutoff) m->print_invocation_count(); |
164 if (c >= MethodHistogramCutoff) m->print_invocation_count(); |
162 int_total += m->invocation_count(); |
165 int_total += m->invocation_count(); |
163 comp_total += m->compiled_invocation_count(); |
166 comp_total += m->compiled_invocation_count(); |
164 if (m->is_final()) final_total += c; |
167 if (m->is_final()) final_total += c; |
183 } |
186 } |
184 |
187 |
185 void print_method_profiling_data() { |
188 void print_method_profiling_data() { |
186 ResourceMark rm; |
189 ResourceMark rm; |
187 HandleMark hm; |
190 HandleMark hm; |
188 collected_profiled_methods = new GrowableArray<methodOop>(1024); |
191 collected_profiled_methods = new GrowableArray<Method*>(1024); |
189 SystemDictionary::methods_do(collect_profiled_methods); |
192 SystemDictionary::methods_do(collect_profiled_methods); |
190 collected_profiled_methods->sort(&compare_methods); |
193 collected_profiled_methods->sort(&compare_methods); |
191 |
194 |
192 int count = collected_profiled_methods->length(); |
195 int count = collected_profiled_methods->length(); |
193 if (count > 0) { |
196 if (count > 0) { |
194 for (int index = 0; index < count; index++) { |
197 for (int index = 0; index < count; index++) { |
195 methodOop m = collected_profiled_methods->at(index); |
198 Method* m = collected_profiled_methods->at(index); |
196 ttyLocker ttyl; |
199 ttyLocker ttyl; |
197 tty->print_cr("------------------------------------------------------------------------"); |
200 tty->print_cr("------------------------------------------------------------------------"); |
198 //m->print_name(tty); |
201 //m->print_name(tty); |
199 m->print_invocation_count(); |
202 m->print_invocation_count(); |
200 tty->cr(); |
203 tty->cr(); |