comparison src/share/vm/runtime/compilationPolicy.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 20334ed5ed3c
children 9191895df19d
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
26 #include "code/compiledIC.hpp" 26 #include "code/compiledIC.hpp"
27 #include "code/nmethod.hpp" 27 #include "code/nmethod.hpp"
28 #include "code/scopeDesc.hpp" 28 #include "code/scopeDesc.hpp"
29 #include "compiler/compilerOracle.hpp" 29 #include "compiler/compilerOracle.hpp"
30 #include "interpreter/interpreter.hpp" 30 #include "interpreter/interpreter.hpp"
31 #include "oops/methodDataOop.hpp" 31 #include "oops/methodData.hpp"
32 #include "oops/methodOop.hpp" 32 #include "oops/method.hpp"
33 #include "oops/oop.inline.hpp" 33 #include "oops/oop.inline.hpp"
34 #include "prims/nativeLookup.hpp" 34 #include "prims/nativeLookup.hpp"
35 #include "runtime/advancedThresholdPolicy.hpp" 35 #include "runtime/advancedThresholdPolicy.hpp"
36 #include "runtime/compilationPolicy.hpp" 36 #include "runtime/compilationPolicy.hpp"
37 #include "runtime/frame.hpp" 37 #include "runtime/frame.hpp"
220 // Interates through invocation counters and decrements them. This 220 // Interates through invocation counters and decrements them. This
221 // is done at each safepoint. 221 // is done at each safepoint.
222 // 222 //
223 class CounterDecay : public AllStatic { 223 class CounterDecay : public AllStatic {
224 static jlong _last_timestamp; 224 static jlong _last_timestamp;
225 static void do_method(methodOop m) { 225 static void do_method(Method* m) {
226 m->invocation_counter()->decay(); 226 m->invocation_counter()->decay();
227 } 227 }
228 public: 228 public:
229 static void decay(); 229 static void decay();
230 static bool is_decay_needed() { 230 static bool is_decay_needed() {
243 assert(SafepointSynchronize::is_at_safepoint(), "can only be executed at a safepoint"); 243 assert(SafepointSynchronize::is_at_safepoint(), "can only be executed at a safepoint");
244 int nclasses = SystemDictionary::number_of_classes(); 244 int nclasses = SystemDictionary::number_of_classes();
245 double classes_per_tick = nclasses * (CounterDecayMinIntervalLength * 1e-3 / 245 double classes_per_tick = nclasses * (CounterDecayMinIntervalLength * 1e-3 /
246 CounterHalfLifeTime); 246 CounterHalfLifeTime);
247 for (int i = 0; i < classes_per_tick; i++) { 247 for (int i = 0; i < classes_per_tick; i++) {
248 klassOop k = SystemDictionary::try_get_next_class(); 248 Klass* k = SystemDictionary::try_get_next_class();
249 if (k != NULL && k->klass_part()->oop_is_instance()) { 249 if (k != NULL && k->oop_is_instance()) {
250 instanceKlass::cast(k)->methods_do(do_method); 250 InstanceKlass::cast(k)->methods_do(do_method);
251 } 251 }
252 } 252 }
253 } 253 }
254 254
255 // Called at the end of the safepoint 255 // Called at the end of the safepoint
275 sd->method()->backedge_counter()->reset(); 275 sd->method()->backedge_counter()->reset();
276 } 276 }
277 277
278 // This method can be called by any component of the runtime to notify the policy 278 // This method can be called by any component of the runtime to notify the policy
279 // that it's recommended to delay the complation of this method. 279 // that it's recommended to delay the complation of this method.
280 void NonTieredCompPolicy::delay_compilation(methodOop method) { 280 void NonTieredCompPolicy::delay_compilation(Method* method) {
281 method->invocation_counter()->decay(); 281 method->invocation_counter()->decay();
282 method->backedge_counter()->decay(); 282 method->backedge_counter()->decay();
283 } 283 }
284 284
285 void NonTieredCompPolicy::disable_compilation(methodOop method) { 285 void NonTieredCompPolicy::disable_compilation(Method* method) {
286 method->invocation_counter()->set_state(InvocationCounter::wait_for_nothing); 286 method->invocation_counter()->set_state(InvocationCounter::wait_for_nothing);
287 method->backedge_counter()->set_state(InvocationCounter::wait_for_nothing); 287 method->backedge_counter()->set_state(InvocationCounter::wait_for_nothing);
288 } 288 }
289 289
290 CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) { 290 CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) {
291 return compile_queue->first(); 291 return compile_queue->first();
292 } 292 }
293 293
294 bool NonTieredCompPolicy::is_mature(methodOop method) { 294 bool NonTieredCompPolicy::is_mature(Method* method) {
295 methodDataOop mdo = method->method_data(); 295 MethodData* mdo = method->method_data();
296 assert(mdo != NULL, "Should be"); 296 assert(mdo != NULL, "Should be");
297 uint current = mdo->mileage_of(method); 297 uint current = mdo->mileage_of(method);
298 uint initial = mdo->creation_mileage(); 298 uint initial = mdo->creation_mileage();
299 if (current < initial) 299 if (current < initial)
300 return true; // some sort of overflow 300 return true; // some sort of overflow
369 tty->cr(); 369 tty->cr();
370 ic->print(); 370 ic->print();
371 bc->print(); 371 bc->print();
372 if (ProfileInterpreter) { 372 if (ProfileInterpreter) {
373 if (bci != InvocationEntryBci) { 373 if (bci != InvocationEntryBci) {
374 methodDataOop mdo = m->method_data(); 374 MethodData* mdo = m->method_data();
375 if (mdo != NULL) { 375 if (mdo != NULL) {
376 int count = mdo->bci_to_data(branch_bci)->as_JumpData()->taken(); 376 int count = mdo->bci_to_data(branch_bci)->as_JumpData()->taken();
377 tty->print_cr("back branch count = %d", count); 377 tty->print_cr("back branch count = %d", count);
378 } 378 }
379 } 379 }
625 625
626 const char* StackWalkCompPolicy::shouldNotInline(methodHandle m) { 626 const char* StackWalkCompPolicy::shouldNotInline(methodHandle m) {
627 // negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg 627 // negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg
628 if (m->is_abstract()) return (_msg = "abstract method"); 628 if (m->is_abstract()) return (_msg = "abstract method");
629 // note: we allow ik->is_abstract() 629 // note: we allow ik->is_abstract()
630 if (!instanceKlass::cast(m->method_holder())->is_initialized()) return (_msg = "method holder not initialized"); 630 if (!InstanceKlass::cast(m->method_holder())->is_initialized()) return (_msg = "method holder not initialized");
631 if (m->is_native()) return (_msg = "native method"); 631 if (m->is_native()) return (_msg = "native method");
632 nmethod* m_code = m->code(); 632 nmethod* m_code = m->code();
633 if (m_code != NULL && m_code->code_size() > InlineSmallCode) 633 if (m_code != NULL && m_code->code_size() > InlineSmallCode)
634 return (_msg = "already compiled into a big method"); 634 return (_msg = "already compiled into a big method");
635 635
637 if (m->code_size() <= MaxTrivialSize) return NULL; 637 if (m->code_size() <= MaxTrivialSize) return NULL;
638 if (UseInterpreter) { // don't use counts with -Xcomp 638 if (UseInterpreter) { // don't use counts with -Xcomp
639 if ((m->code() == NULL) && m->was_never_executed()) return (_msg = "never executed"); 639 if ((m->code() == NULL) && m->was_never_executed()) return (_msg = "never executed");
640 if (!m->was_executed_more_than(MIN2(MinInliningThreshold, CompileThreshold >> 1))) return (_msg = "executed < MinInliningThreshold times"); 640 if (!m->was_executed_more_than(MIN2(MinInliningThreshold, CompileThreshold >> 1))) return (_msg = "executed < MinInliningThreshold times");
641 } 641 }
642 if (methodOopDesc::has_unloaded_classes_in_signature(m, JavaThread::current())) return (_msg = "unloaded signature classes"); 642 if (Method::has_unloaded_classes_in_signature(m, JavaThread::current())) return (_msg = "unloaded signature classes");
643 643
644 return NULL; 644 return NULL;
645 } 645 }
646 646
647 647