< prev index next >

src/hotspot/share/oops/methodCounters.cpp

Print this page

  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 #include "precompiled.hpp"

 25 #include "compiler/compiler_globals.hpp"
 26 #include "oops/method.hpp"
 27 #include "oops/methodCounters.hpp"

 28 #include "runtime/handles.inline.hpp"

 29 
 30 MethodCounters::MethodCounters(const methodHandle& mh) :


 31   _prev_time(0),
 32   _rate(0),
 33   _highest_comp_level(0),
 34   _highest_osr_comp_level(0)
 35 {
 36   set_interpreter_throwout_count(0);
 37   JVMTI_ONLY(clear_number_of_breakpoints());
 38   invocation_counter()->init();
 39   backedge_counter()->init();
 40 
 41   // Set per-method thresholds.
 42   double scale = 1.0;
 43   CompilerOracle::has_option_value(mh, CompileCommand::CompileThresholdScaling, scale);
 44 
 45   _invoke_mask = right_n_bits(CompilerConfig::scaled_freq_log(Tier0InvokeNotifyFreqLog, scale)) << InvocationCounter::count_shift;
 46   _backedge_mask = right_n_bits(CompilerConfig::scaled_freq_log(Tier0BackedgeNotifyFreqLog, scale)) << InvocationCounter::count_shift;
 47 }
 48 




 49 MethodCounters* MethodCounters::allocate_no_exception(const methodHandle& mh) {
 50   ClassLoaderData* loader_data = mh->method_holder()->class_loader_data();
 51   return new(loader_data, method_counters_size(), MetaspaceObj::MethodCountersType) MethodCounters(mh);
 52 }
 53 
 54 MethodCounters* MethodCounters::allocate_with_exception(const methodHandle& mh, TRAPS) {
 55   ClassLoaderData* loader_data = mh->method_holder()->class_loader_data();
 56   return new(loader_data, method_counters_size(), MetaspaceObj::MethodCountersType, THREAD) MethodCounters(mh);
 57 }
 58 
 59 void MethodCounters::clear_counters() {
 60   invocation_counter()->reset();
 61   backedge_counter()->reset();
 62   set_interpreter_throwout_count(0);
 63   set_prev_time(0);
 64   set_prev_event_count(0);
 65   set_rate(0);
 66   set_highest_comp_level(0);
 67   set_highest_osr_comp_level(0);
 68 }
 69 








































 70 void MethodCounters::print_value_on(outputStream* st) const {
 71   assert(is_methodCounters(), "must be methodCounters");
 72   st->print("method counters");
 73   print_address_on(st);
 74 }
 75 
 76 

  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 #include "precompiled.hpp"
 25 #include "cds/cdsConfig.hpp"
 26 #include "compiler/compiler_globals.hpp"
 27 #include "memory/metaspaceClosure.hpp"
 28 #include "oops/methodCounters.hpp"
 29 #include "oops/trainingData.hpp"
 30 #include "runtime/handles.inline.hpp"
 31 #include "memory/resourceArea.hpp"
 32 
 33 MethodCounters::MethodCounters(const methodHandle& mh) :
 34   _method(mh()),
 35   _method_training_data(nullptr),
 36   _prev_time(0),
 37   _rate(0),
 38   _highest_comp_level(0),
 39   _highest_osr_comp_level(0)
 40 {
 41   set_interpreter_throwout_count(0);
 42   JVMTI_ONLY(clear_number_of_breakpoints());
 43   invocation_counter()->init();
 44   backedge_counter()->init();
 45 
 46   // Set per-method thresholds.
 47   double scale = 1.0;
 48   CompilerOracle::has_option_value(mh, CompileCommand::CompileThresholdScaling, scale);
 49 
 50   _invoke_mask = right_n_bits(CompilerConfig::scaled_freq_log(Tier0InvokeNotifyFreqLog, scale)) << InvocationCounter::count_shift;
 51   _backedge_mask = right_n_bits(CompilerConfig::scaled_freq_log(Tier0BackedgeNotifyFreqLog, scale)) << InvocationCounter::count_shift;
 52 }
 53 
 54 MethodCounters::MethodCounters() {
 55   assert(CDSConfig::is_dumping_static_archive() || UseSharedSpaces, "only for CDS");
 56 }
 57 
 58 MethodCounters* MethodCounters::allocate_no_exception(const methodHandle& mh) {
 59   ClassLoaderData* loader_data = mh->method_holder()->class_loader_data();
 60   return new(loader_data, method_counters_size(), MetaspaceObj::MethodCountersType) MethodCounters(mh);
 61 }
 62 
 63 MethodCounters* MethodCounters::allocate_with_exception(const methodHandle& mh, TRAPS) {
 64   ClassLoaderData* loader_data = mh->method_holder()->class_loader_data();
 65   return new(loader_data, method_counters_size(), MetaspaceObj::MethodCountersType, THREAD) MethodCounters(mh);
 66 }
 67 
 68 void MethodCounters::clear_counters() {
 69   invocation_counter()->reset();
 70   backedge_counter()->reset();
 71   set_interpreter_throwout_count(0);
 72   set_prev_time(0);
 73   set_prev_event_count(0);
 74   set_rate(0);
 75   set_highest_comp_level(0);
 76   set_highest_osr_comp_level(0);
 77 }
 78 
 79 void MethodCounters::metaspace_pointers_do(MetaspaceClosure* it) {
 80   log_trace(cds)("Iter(MethodCounters): %p", this);
 81   it->push(&_method);
 82   it->push(&_method_training_data);
 83 }
 84 
 85 #if INCLUDE_CDS
 86 void MethodCounters::remove_unshareable_info() {
 87   _method_training_data = nullptr;
 88 }
 89 
 90 void MethodCounters::restore_unshareable_info(TRAPS) {
 91 }
 92 #endif // INCLUDE_CDS
 93 
 94 void MethodCounters::print_on(outputStream* st) const {
 95   assert(is_methodCounters(), "should be method counters");
 96   st->print("method counters");
 97   print_data_on(st);
 98 }
 99 
100 void MethodCounters::print_data_on(outputStream* st) const {
101   ResourceMark rm;
102   st->print_cr("  - invocation_counter: %d carry=%d", _invocation_counter.count(), _invocation_counter.carry());
103   st->print_cr("  - backedge_counter: %d carry=%d",   _backedge_counter.count(), _backedge_counter.carry());
104   st->print_cr("  - prev_time: " JLONG_FORMAT,        _prev_time);
105   st->print_cr("  - rate: %.3f",             _rate);
106   st->print_cr("  - invoke_mask: %d",        _invoke_mask);
107   st->print_cr("  - backedge_mask: %d",      _backedge_mask);
108   st->print_cr("  - prev_event_count: %d",   _prev_event_count);
109 #if COMPILER2_OR_JVMCI
110   st->print_cr("  - interpreter_throwout_count: %u", _interpreter_throwout_count);
111 #endif
112 #if INCLUDE_JVMTI
113   st->print_cr("  - number_of_breakpoints: %u", _number_of_breakpoints);
114 #endif
115   st->print_cr("  - highest_comp_level: %u", _highest_comp_level);
116   st->print_cr("  - highest_osr_comp_level: %u", _highest_osr_comp_level);
117 }
118 
119 void MethodCounters::print_value_on(outputStream* st) const {
120   assert(is_methodCounters(), "must be methodCounters");
121   st->print("method counters");
122   print_address_on(st);
123 }
124 
125 
< prev index next >