1 /* 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 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 25 #include "precompiled.hpp" 26 #include "code/codeCache.hpp" 27 #include "code/compiledIC.hpp" 28 #include "code/icBuffer.hpp" 29 #include "code/nmethod.hpp" 30 #include "compiler/compileBroker.hpp" 31 #include "memory/resourceArea.hpp" 32 #include "oops/method.hpp" 33 #include "runtime/atomic.inline.hpp" 34 #include "runtime/compilationPolicy.hpp" 35 #include "runtime/mutexLocker.hpp" 36 #include "runtime/orderAccess.inline.hpp" 37 #include "runtime/os.hpp" 38 #include "runtime/sweeper.hpp" 39 #include "runtime/thread.inline.hpp" 40 #include "runtime/vm_operations.hpp" 41 #include "trace/tracing.hpp" 42 #include "utilities/events.hpp" 43 #include "utilities/ticks.inline.hpp" 44 #include "utilities/xmlstream.hpp" 45 46 #ifdef ASSERT 47 48 #define SWEEP(nm) record_sweep(nm, __LINE__) 49 // Sweeper logging code 50 class SweeperRecord { 51 public: 52 int traversal; 53 int compile_id; 54 long traversal_mark; 55 int state; 56 const char* kind; 57 address vep; 58 address uep; 59 int line; 60 61 void print() { 62 tty->print_cr("traversal = %d compile_id = %d %s uep = " PTR_FORMAT " vep = " 63 PTR_FORMAT " state = %d traversal_mark %ld line = %d", 64 traversal, 65 compile_id, 66 kind == NULL ? "" : kind, 67 p2i(uep), 68 p2i(vep), 69 state, 70 traversal_mark, 71 line); 72 } 73 }; 74 75 static int _sweep_index = 0; 76 static SweeperRecord* _records = NULL; 77 78 void NMethodSweeper::report_events(int id, address entry) { 79 if (_records != NULL) { 80 for (int i = _sweep_index; i < SweeperLogEntries; i++) { 81 if (_records[i].uep == entry || 82 _records[i].vep == entry || 83 _records[i].compile_id == id) { 84 _records[i].print(); 85 } 86 } 87 for (int i = 0; i < _sweep_index; i++) { 88 if (_records[i].uep == entry || 89 _records[i].vep == entry || 90 _records[i].compile_id == id) { 91 _records[i].print(); 92 } 93 } 94 } 95 } 96 97 void NMethodSweeper::report_events() { 98 if (_records != NULL) { 99 for (int i = _sweep_index; i < SweeperLogEntries; i++) { 100 // skip empty records 101 if (_records[i].vep == NULL) continue; 102 _records[i].print(); 103 } 104 for (int i = 0; i < _sweep_index; i++) { 105 // skip empty records 106 if (_records[i].vep == NULL) continue; 107 _records[i].print(); 108 } 109 } 110 } 111 112 void NMethodSweeper::record_sweep(nmethod* nm, int line) { 113 if (_records != NULL) { 114 _records[_sweep_index].traversal = _traversals; 115 _records[_sweep_index].traversal_mark = nm->_stack_traversal_mark; 116 _records[_sweep_index].compile_id = nm->compile_id(); 117 _records[_sweep_index].kind = nm->compile_kind(); 118 _records[_sweep_index].state = nm->_state; 119 _records[_sweep_index].vep = nm->verified_entry_point(); 120 _records[_sweep_index].uep = nm->entry_point(); 121 _records[_sweep_index].line = line; 122 _sweep_index = (_sweep_index + 1) % SweeperLogEntries; 123 } 124 } 125 126 void NMethodSweeper::init_sweeper_log() { 127 if (LogSweeper && _records == NULL) { 128 // Create the ring buffer for the logging code 129 _records = NEW_C_HEAP_ARRAY(SweeperRecord, SweeperLogEntries, mtGC); 130 memset(_records, 0, sizeof(SweeperRecord) * SweeperLogEntries); 131 } 132 } 133 #else 134 #define SWEEP(nm) 135 #endif 136 137 NMethodIterator NMethodSweeper::_current; // Current nmethod 138 long NMethodSweeper::_traversals = 0; // Stack scan count, also sweep ID. 139 long NMethodSweeper::_total_nof_code_cache_sweeps = 0; // Total number of full sweeps of the code cache 140 long NMethodSweeper::_time_counter = 0; // Virtual time used to periodically invoke sweeper 141 long NMethodSweeper::_last_sweep = 0; // Value of _time_counter when the last sweep happened 142 int NMethodSweeper::_seen = 0; // Nof. nmethod we have currently processed in current pass of CodeCache 143 144 volatile bool NMethodSweeper::_should_sweep = true; // Indicates if we should invoke the sweeper 145 volatile bool NMethodSweeper::_force_sweep = false;// Indicates if we should force a sweep 146 volatile int NMethodSweeper::_bytes_changed = 0; // Counts the total nmethod size if the nmethod changed from: 147 // 1) alive -> not_entrant 148 // 2) not_entrant -> zombie 149 // 3) zombie -> marked_for_reclamation 150 int NMethodSweeper::_hotness_counter_reset_val = 0; 151 152 long NMethodSweeper::_total_nof_methods_reclaimed = 0; // Accumulated nof methods flushed 153 long NMethodSweeper::_total_nof_c2_methods_reclaimed = 0; // Accumulated nof methods flushed 154 size_t NMethodSweeper::_total_flushed_size = 0; // Total number of bytes flushed from the code cache 155 Tickspan NMethodSweeper::_total_time_sweeping; // Accumulated time sweeping 156 Tickspan NMethodSweeper::_total_time_this_sweep; // Total time this sweep 157 Tickspan NMethodSweeper::_peak_sweep_time; // Peak time for a full sweep 158 Tickspan NMethodSweeper::_peak_sweep_fraction_time; // Peak time sweeping one fraction 159 160 Monitor* NMethodSweeper::_stat_lock = new Monitor(Mutex::special, "Sweeper::Statistics", true, Monitor::_safepoint_check_sometimes); 161 162 class MarkActivationClosure: public CodeBlobClosure { 163 public: 164 virtual void do_code_blob(CodeBlob* cb) { 165 assert(cb->is_nmethod(), "CodeBlob should be nmethod"); 166 nmethod* nm = (nmethod*)cb; 167 nm->set_hotness_counter(NMethodSweeper::hotness_counter_reset_val()); 168 // If we see an activation belonging to a non_entrant nmethod, we mark it. 169 if (nm->is_not_entrant()) { 170 nm->mark_as_seen_on_stack(); 171 } 172 } 173 }; 174 static MarkActivationClosure mark_activation_closure; 175 176 class SetHotnessClosure: public CodeBlobClosure { 177 public: 178 virtual void do_code_blob(CodeBlob* cb) { 179 assert(cb->is_nmethod(), "CodeBlob should be nmethod"); 180 nmethod* nm = (nmethod*)cb; 181 nm->set_hotness_counter(NMethodSweeper::hotness_counter_reset_val()); 182 } 183 }; 184 static SetHotnessClosure set_hotness_closure; 185 186 187 int NMethodSweeper::hotness_counter_reset_val() { 188 if (_hotness_counter_reset_val == 0) { 189 _hotness_counter_reset_val = (ReservedCodeCacheSize < M) ? 1 : (ReservedCodeCacheSize / M) * 2; 190 } 191 return _hotness_counter_reset_val; 192 } 193 bool NMethodSweeper::wait_for_stack_scanning() { 194 return _current.end(); 195 } 196 197 /** 198 * Scans the stacks of all Java threads and marks activations of not-entrant methods. 199 * No need to synchronize access, since 'mark_active_nmethods' is always executed at a 200 * safepoint. 201 */ 202 void NMethodSweeper::mark_active_nmethods() { 203 assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint"); 204 // If we do not want to reclaim not-entrant or zombie methods there is no need 205 // to scan stacks 206 if (!MethodFlushing) { 207 return; 208 } 209 210 // Increase time so that we can estimate when to invoke the sweeper again. 211 _time_counter++; 212 213 // Check for restart 214 assert(CodeCache::find_blob_unsafe(_current.method()) == _current.method(), "Sweeper nmethod cached state invalid"); 215 if (wait_for_stack_scanning()) { 216 _seen = 0; 217 _current = NMethodIterator(); 218 // Initialize to first nmethod 219 _current.next(); 220 _traversals += 1; 221 _total_time_this_sweep = Tickspan(); 222 223 if (PrintMethodFlushing) { 224 tty->print_cr("### Sweep: stack traversal %ld", _traversals); 225 } 226 Threads::nmethods_do(&mark_activation_closure); 227 228 } else { 229 // Only set hotness counter 230 Threads::nmethods_do(&set_hotness_closure); 231 } 232 233 OrderAccess::storestore(); 234 } 235 236 /** 237 * This function triggers a VM operation that does stack scanning of active 238 * methods. Stack scanning is mandatory for the sweeper to make progress. 239 */ 240 void NMethodSweeper::do_stack_scanning() { 241 assert(!CodeCache_lock->owned_by_self(), "just checking"); 242 if (wait_for_stack_scanning()) { 243 VM_MarkActiveNMethods op; 244 VMThread::execute(&op); 245 _should_sweep = true; 246 } 247 } 248 249 void NMethodSweeper::sweeper_loop() { 250 bool timeout; 251 while (true) { 252 { 253 ThreadBlockInVM tbivm(JavaThread::current()); 254 MutexLockerEx waiter(CodeCache_lock, Mutex::_no_safepoint_check_flag); 255 const long wait_time = 60*60*24 * 1000; 256 timeout = CodeCache_lock->wait(Mutex::_no_safepoint_check_flag, wait_time); 257 } 258 if (!timeout) { 259 possibly_sweep(); 260 } 261 } 262 } 263 264 /** 265 * Wakes up the sweeper thread to possibly sweep. 266 */ 267 void NMethodSweeper::notify(int code_blob_type) { 268 // Makes sure that we do not invoke the sweeper too often during startup. 269 double start_threshold = 100.0 / (double)StartAggressiveSweepingAt; 270 double aggressive_sweep_threshold = MIN2(start_threshold, 1.1); 271 if (CodeCache::reverse_free_ratio(code_blob_type) >= aggressive_sweep_threshold) { 272 assert_locked_or_safepoint(CodeCache_lock); 273 CodeCache_lock->notify(); 274 } 275 } 276 277 /** 278 * Wakes up the sweeper thread and forces a sweep. Blocks until it finished. 279 */ 280 void NMethodSweeper::force_sweep() { 281 ThreadBlockInVM tbivm(JavaThread::current()); 282 MutexLockerEx waiter(CodeCache_lock, Mutex::_no_safepoint_check_flag); 283 // Request forced sweep 284 _force_sweep = true; 285 while (_force_sweep) { 286 // Notify sweeper that we want to force a sweep and wait for completion. 287 // In case a sweep currently takes place we timeout and try again because 288 // we want to enforce a full sweep. 289 CodeCache_lock->notify(); 290 CodeCache_lock->wait(Mutex::_no_safepoint_check_flag, 1000); 291 } 292 } 293 294 /** 295 * Handle a safepoint request 296 */ 297 void NMethodSweeper::handle_safepoint_request() { 298 if (SafepointSynchronize::is_synchronizing()) { 299 if (PrintMethodFlushing && Verbose) { 300 tty->print_cr("### Sweep at %d out of %d, yielding to safepoint", _seen, CodeCache::nmethod_count()); 301 } 302 MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 303 304 JavaThread* thread = JavaThread::current(); 305 ThreadBlockInVM tbivm(thread); 306 thread->java_suspend_self(); 307 } 308 } 309 310 /** 311 * This function invokes the sweeper if at least one of the three conditions is met: 312 * (1) The code cache is getting full 313 * (2) There are sufficient state changes in/since the last sweep. 314 * (3) We have not been sweeping for 'some time' 315 */ 316 void NMethodSweeper::possibly_sweep() { 317 assert(JavaThread::current()->thread_state() == _thread_in_vm, "must run in vm mode"); 318 // If there was no state change while nmethod sweeping, 'should_sweep' will be false. 319 // This is one of the two places where should_sweep can be set to true. The general 320 // idea is as follows: If there is enough free space in the code cache, there is no 321 // need to invoke the sweeper. The following formula (which determines whether to invoke 322 // the sweeper or not) depends on the assumption that for larger ReservedCodeCacheSizes 323 // we need less frequent sweeps than for smaller ReservedCodecCacheSizes. Furthermore, 324 // the formula considers how much space in the code cache is currently used. Here are 325 // some examples that will (hopefully) help in understanding. 326 // 327 // Small ReservedCodeCacheSizes: (e.g., < 16M) We invoke the sweeper every time, since 328 // the result of the division is 0. This 329 // keeps the used code cache size small 330 // (important for embedded Java) 331 // Large ReservedCodeCacheSize : (e.g., 256M + code cache is 10% full). The formula 332 // computes: (256 / 16) - 1 = 15 333 // As a result, we invoke the sweeper after 334 // 15 invocations of 'mark_active_nmethods. 335 // Large ReservedCodeCacheSize: (e.g., 256M + code Cache is 90% full). The formula 336 // computes: (256 / 16) - 10 = 6. 337 if (!_should_sweep) { 338 const int time_since_last_sweep = _time_counter - _last_sweep; 339 // ReservedCodeCacheSize has an 'unsigned' type. We need a 'signed' type for max_wait_time, 340 // since 'time_since_last_sweep' can be larger than 'max_wait_time'. If that happens using 341 // an unsigned type would cause an underflow (wait_until_next_sweep becomes a large positive 342 // value) that disables the intended periodic sweeps. 343 const int max_wait_time = ReservedCodeCacheSize / (16 * M); 344 double wait_until_next_sweep = max_wait_time - time_since_last_sweep - 345 MAX2(CodeCache::reverse_free_ratio(CodeBlobType::MethodProfiled), 346 CodeCache::reverse_free_ratio(CodeBlobType::MethodNonProfiled)); 347 assert(wait_until_next_sweep <= (double)max_wait_time, "Calculation of code cache sweeper interval is incorrect"); 348 349 if ((wait_until_next_sweep <= 0.0) || !CompileBroker::should_compile_new_jobs()) { 350 _should_sweep = true; 351 } 352 } 353 354 // Remember if this was a forced sweep 355 bool forced = _force_sweep; 356 357 // Force stack scanning if there is only 10% free space in the code cache. 358 // We force stack scanning only if the non-profiled code heap gets full, since critical 359 // allocations go to the non-profiled heap and we must be make sure that there is 360 // enough space. 361 double free_percent = 1 / CodeCache::reverse_free_ratio(CodeBlobType::MethodNonProfiled) * 100; 362 if (free_percent <= StartAggressiveSweepingAt) { 363 do_stack_scanning(); 364 } 365 366 if (_should_sweep || forced) { 367 init_sweeper_log(); 368 sweep_code_cache(); 369 } 370 371 // We are done with sweeping the code cache once. 372 _total_nof_code_cache_sweeps++; 373 _last_sweep = _time_counter; 374 // Reset flag; temporarily disables sweeper 375 _should_sweep = false; 376 // If there was enough state change, 'possibly_enable_sweeper()' 377 // sets '_should_sweep' to true 378 possibly_enable_sweeper(); 379 // Reset _bytes_changed only if there was enough state change. _bytes_changed 380 // can further increase by calls to 'report_state_change'. 381 if (_should_sweep) { 382 _bytes_changed = 0; 383 } 384 385 if (forced) { 386 // Notify requester that forced sweep finished 387 assert(_force_sweep, "Should be a forced sweep"); 388 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 389 _force_sweep = false; 390 CodeCache_lock->notify(); 391 } 392 } 393 394 void NMethodSweeper::sweep_code_cache() { 395 ResourceMark rm; 396 Ticks sweep_start_counter = Ticks::now(); 397 398 int flushed_count = 0; 399 int zombified_count = 0; 400 int marked_for_reclamation_count = 0; 401 int flushed_c2_count = 0; 402 403 if (PrintMethodFlushing && Verbose) { 404 tty->print_cr("### Sweep at %d out of %d", _seen, CodeCache::nmethod_count()); 405 } 406 407 int swept_count = 0; 408 assert(!SafepointSynchronize::is_at_safepoint(), "should not be in safepoint when we get here"); 409 assert(!CodeCache_lock->owned_by_self(), "just checking"); 410 411 int freed_memory = 0; 412 { 413 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 414 415 while (!_current.end()) { 416 swept_count++; 417 // Since we will give up the CodeCache_lock, always skip ahead 418 // to the next nmethod. Other blobs can be deleted by other 419 // threads but nmethods are only reclaimed by the sweeper. 420 nmethod* nm = _current.method(); 421 _current.next(); 422 423 // Now ready to process nmethod and give up CodeCache_lock 424 { 425 MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 426 // Save information before potentially flushing the nmethod 427 int size = nm->total_size(); 428 bool is_c2_method = nm->is_compiled_by_c2(); 429 bool is_osr = nm->is_osr_method(); 430 int compile_id = nm->compile_id(); 431 intptr_t address = p2i(nm); 432 const char* state_before = nm->state(); 433 const char* state_after = ""; 434 435 MethodStateChange type = process_nmethod(nm); 436 switch (type) { 437 case Flushed: 438 state_after = "flushed"; 439 freed_memory += size; 440 ++flushed_count; 441 if (is_c2_method) { 442 ++flushed_c2_count; 443 } 444 break; 445 case MarkedForReclamation: 446 state_after = "marked for reclamation"; 447 ++marked_for_reclamation_count; 448 break; 449 case MadeZombie: 450 state_after = "made zombie"; 451 ++zombified_count; 452 break; 453 case None: 454 break; 455 default: 456 ShouldNotReachHere(); 457 } 458 if (PrintMethodFlushing && Verbose && type != None) { 459 tty->print_cr("### %s nmethod %3d/" PTR_FORMAT " (%s) %s", is_osr ? "osr" : "", compile_id, address, state_before, state_after); 460 } 461 } 462 463 _seen++; 464 handle_safepoint_request(); 465 } 466 } 467 468 assert(_current.end(), "must have scanned the whole cache"); 469 470 const Ticks sweep_end_counter = Ticks::now(); 471 const Tickspan sweep_time = sweep_end_counter - sweep_start_counter; 472 { 473 MutexLockerEx mu(_stat_lock, Mutex::_no_safepoint_check_flag); 474 _total_time_sweeping += sweep_time; 475 _total_time_this_sweep += sweep_time; 476 _peak_sweep_fraction_time = MAX2(sweep_time, _peak_sweep_fraction_time); 477 _total_flushed_size += freed_memory; 478 _total_nof_methods_reclaimed += flushed_count; 479 _total_nof_c2_methods_reclaimed += flushed_c2_count; 480 _peak_sweep_time = MAX2(_peak_sweep_time, _total_time_this_sweep); 481 } 482 EventSweepCodeCache event(UNTIMED); 483 if (event.should_commit()) { 484 event.set_starttime(sweep_start_counter); 485 event.set_endtime(sweep_end_counter); 486 event.set_sweepIndex(_traversals); 487 event.set_sweptCount(swept_count); 488 event.set_flushedCount(flushed_count); 489 event.set_markedCount(marked_for_reclamation_count); 490 event.set_zombifiedCount(zombified_count); 491 event.commit(); 492 } 493 494 #ifdef ASSERT 495 if(PrintMethodFlushing) { 496 tty->print_cr("### sweeper: sweep time(" JLONG_FORMAT "): ", sweep_time.value()); 497 } 498 #endif 499 500 log_sweep("finished"); 501 502 // Sweeper is the only case where memory is released, check here if it 503 // is time to restart the compiler. Only checking if there is a certain 504 // amount of free memory in the code cache might lead to re-enabling 505 // compilation although no memory has been released. For example, there are 506 // cases when compilation was disabled although there is 4MB (or more) free 507 // memory in the code cache. The reason is code cache fragmentation. Therefore, 508 // it only makes sense to re-enable compilation if we have actually freed memory. 509 // Note that typically several kB are released for sweeping 16MB of the code 510 // cache. As a result, 'freed_memory' > 0 to restart the compiler. 511 if (!CompileBroker::should_compile_new_jobs() && (freed_memory > 0)) { 512 CompileBroker::set_should_compile_new_jobs(CompileBroker::run_compilation); 513 log_sweep("restart_compiler"); 514 } 515 } 516 517 /** 518 * This function updates the sweeper statistics that keep track of nmethods 519 * state changes. If there is 'enough' state change, the sweeper is invoked 520 * as soon as possible. There can be data races on _bytes_changed. The data 521 * races are benign, since it does not matter if we loose a couple of bytes. 522 * In the worst case we call the sweeper a little later. Also, we are guaranteed 523 * to invoke the sweeper if the code cache gets full. 524 */ 525 void NMethodSweeper::report_state_change(nmethod* nm) { 526 _bytes_changed += nm->total_size(); 527 possibly_enable_sweeper(); 528 } 529 530 /** 531 * Function determines if there was 'enough' state change in the code cache to invoke 532 * the sweeper again. Currently, we determine 'enough' as more than 1% state change in 533 * the code cache since the last sweep. 534 */ 535 void NMethodSweeper::possibly_enable_sweeper() { 536 double percent_changed = ((double)_bytes_changed / (double)ReservedCodeCacheSize) * 100; 537 if (percent_changed > 1.0) { 538 _should_sweep = true; 539 } 540 } 541 542 class NMethodMarker: public StackObj { 543 private: 544 CodeCacheSweeperThread* _thread; 545 public: 546 NMethodMarker(nmethod* nm) { 547 JavaThread* current = JavaThread::current(); 548 assert (current->is_Code_cache_sweeper_thread(), "Must be"); 549 _thread = (CodeCacheSweeperThread*)current; 550 if (!nm->is_zombie() && !nm->is_unloaded()) { 551 // Only expose live nmethods for scanning 552 _thread->set_scanned_nmethod(nm); 553 } 554 } 555 ~NMethodMarker() { 556 _thread->set_scanned_nmethod(NULL); 557 } 558 }; 559 560 void NMethodSweeper::release_nmethod(nmethod* nm) { 561 // Make sure the released nmethod is no longer referenced by the sweeper thread 562 CodeCacheSweeperThread* thread = (CodeCacheSweeperThread*)JavaThread::current(); 563 thread->set_scanned_nmethod(NULL); 564 565 // Clean up any CompiledICHolders 566 { 567 ResourceMark rm; 568 MutexLocker ml_patch(CompiledIC_lock); 569 RelocIterator iter(nm); 570 while (iter.next()) { 571 if (iter.type() == relocInfo::virtual_call_type) { 572 CompiledIC::cleanup_call_site(iter.virtual_call_reloc()); 573 } 574 } 575 } 576 577 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 578 nm->flush(); 579 } 580 581 NMethodSweeper::MethodStateChange NMethodSweeper::process_nmethod(nmethod* nm) { 582 assert(nm != NULL, "sanity"); 583 assert(!CodeCache_lock->owned_by_self(), "just checking"); 584 585 MethodStateChange result = None; 586 // Make sure this nmethod doesn't get unloaded during the scan, 587 // since safepoints may happen during acquired below locks. 588 NMethodMarker nmm(nm); 589 SWEEP(nm); 590 591 // Skip methods that are currently referenced by the VM 592 if (nm->is_locked_by_vm()) { 593 // But still remember to clean-up inline caches for alive nmethods 594 if (nm->is_alive()) { 595 // Clean inline caches that point to zombie/non-entrant/unloaded nmethods 596 MutexLocker cl(CompiledIC_lock); 597 nm->cleanup_inline_caches(); 598 SWEEP(nm); 599 } 600 return result; 601 } 602 603 if (nm->is_zombie()) { 604 // If it is the first time we see nmethod then we mark it. Otherwise, 605 // we reclaim it. When we have seen a zombie method twice, we know that 606 // there are no inline caches that refer to it. 607 if (nm->is_marked_for_reclamation()) { 608 assert(!nm->is_locked_by_vm(), "must not flush locked nmethods"); 609 release_nmethod(nm); 610 assert(result == None, "sanity"); 611 result = Flushed; 612 } else { 613 nm->mark_for_reclamation(); 614 // Keep track of code cache state change 615 _bytes_changed += nm->total_size(); 616 SWEEP(nm); 617 assert(result == None, "sanity"); 618 result = MarkedForReclamation; 619 assert(nm->is_marked_for_reclamation(), "nmethod must be marked for reclamation"); 620 } 621 } else if (nm->is_not_entrant()) { 622 // If there are no current activations of this method on the 623 // stack we can safely convert it to a zombie method 624 if (nm->can_convert_to_zombie()) { 625 // Clear ICStubs to prevent back patching stubs of zombie or flushed 626 // nmethods during the next safepoint (see ICStub::finalize). 627 { 628 MutexLocker cl(CompiledIC_lock); 629 nm->clear_ic_stubs(); 630 } 631 // Code cache state change is tracked in make_zombie() 632 nm->make_zombie(); 633 SWEEP(nm); 634 if (nm->is_osr_method()) { 635 // No inline caches will ever point to osr methods, so we can just remove it. 636 // Make sure that we unregistered the nmethod with the heap and flushed all 637 // dependencies before removing the nmethod (done in make_zombie()). 638 assert(nm->is_zombie(), "nmethod must be unregistered"); 639 release_nmethod(nm); 640 assert(result == None, "sanity"); 641 result = Flushed; 642 } else { 643 assert(result == None, "sanity"); 644 result = MadeZombie; 645 assert(nm->is_zombie(), "nmethod must be zombie"); 646 } 647 } else { 648 // Still alive, clean up its inline caches 649 MutexLocker cl(CompiledIC_lock); 650 nm->cleanup_inline_caches(); 651 SWEEP(nm); 652 } 653 } else if (nm->is_unloaded()) { 654 // Code is unloaded, so there are no activations on the stack. 655 // Convert the nmethod to zombie or flush it directly in the OSR case. 656 { 657 // Clean ICs of unloaded nmethods as well because they may reference other 658 // unloaded nmethods that may be flushed earlier in the sweeper cycle. 659 MutexLocker cl(CompiledIC_lock); 660 nm->cleanup_inline_caches(); 661 } 662 if (nm->is_osr_method()) { 663 SWEEP(nm); 664 // No inline caches will ever point to osr methods, so we can just remove it 665 release_nmethod(nm); 666 assert(result == None, "sanity"); 667 result = Flushed; 668 } else { 669 // Code cache state change is tracked in make_zombie() 670 nm->make_zombie(); 671 SWEEP(nm); 672 assert(result == None, "sanity"); 673 result = MadeZombie; 674 } 675 } else { 676 possibly_flush(nm); 677 // Clean inline caches that point to zombie/non-entrant/unloaded nmethods 678 MutexLocker cl(CompiledIC_lock); 679 nm->cleanup_inline_caches(); 680 SWEEP(nm); 681 } 682 return result; 683 } 684 685 686 void NMethodSweeper::possibly_flush(nmethod* nm) { 687 if (UseCodeCacheFlushing) { 688 if (!nm->is_locked_by_vm() && !nm->is_native_method()) { 689 bool make_not_entrant = false; 690 691 // Do not make native methods not-entrant 692 nm->dec_hotness_counter(); 693 // Get the initial value of the hotness counter. This value depends on the 694 // ReservedCodeCacheSize 695 int reset_val = hotness_counter_reset_val(); 696 int time_since_reset = reset_val - nm->hotness_counter(); 697 int code_blob_type = CodeCache::get_code_blob_type(nm); 698 double threshold = -reset_val + (CodeCache::reverse_free_ratio(code_blob_type) * NmethodSweepActivity); 699 // The less free space in the code cache we have - the bigger reverse_free_ratio() is. 700 // I.e., 'threshold' increases with lower available space in the code cache and a higher 701 // NmethodSweepActivity. If the current hotness counter - which decreases from its initial 702 // value until it is reset by stack walking - is smaller than the computed threshold, the 703 // corresponding nmethod is considered for removal. 704 if ((NmethodSweepActivity > 0) && (nm->hotness_counter() < threshold) && (time_since_reset > MinPassesBeforeFlush)) { 705 // A method is marked as not-entrant if the method is 706 // 1) 'old enough': nm->hotness_counter() < threshold 707 // 2) The method was in_use for a minimum amount of time: (time_since_reset > MinPassesBeforeFlush) 708 // The second condition is necessary if we are dealing with very small code cache 709 // sizes (e.g., <10m) and the code cache size is too small to hold all hot methods. 710 // The second condition ensures that methods are not immediately made not-entrant 711 // after compilation. 712 make_not_entrant = true; 713 } 714 715 // The stack-scanning low-cost detection may not see the method was used (which can happen for 716 // flat profiles). Check the age counter for possible data. 717 if (UseCodeAging && make_not_entrant && (nm->is_compiled_by_c2() || nm->is_compiled_by_c1())) { 718 MethodCounters* mc = nm->method()->get_method_counters(Thread::current()); 719 if (mc != NULL) { 720 // Snapshot the value as it's changed concurrently 721 int age = mc->nmethod_age(); 722 if (MethodCounters::is_nmethod_hot(age)) { 723 // The method has gone through flushing, and it became relatively hot that it deopted 724 // before we could take a look at it. Give it more time to appear in the stack traces, 725 // proportional to the number of deopts. 726 MethodData* md = nm->method()->method_data(); 727 if (md != NULL && time_since_reset > (int)(MinPassesBeforeFlush * (md->tenure_traps() + 1))) { 728 // It's been long enough, we still haven't seen it on stack. 729 // Try to flush it, but enable counters the next time. 730 mc->reset_nmethod_age(); 731 } else { 732 make_not_entrant = false; 733 } 734 } else if (MethodCounters::is_nmethod_warm(age)) { 735 // Method has counters enabled, and the method was used within 736 // previous MinPassesBeforeFlush sweeps. Reset the counter. Stay in the existing 737 // compiled state. 738 mc->reset_nmethod_age(); 739 // delay the next check 740 nm->set_hotness_counter(NMethodSweeper::hotness_counter_reset_val()); 741 make_not_entrant = false; 742 } else if (MethodCounters::is_nmethod_age_unset(age)) { 743 // No counters were used before. Set the counters to the detection 744 // limit value. If the method is going to be used again it will be compiled 745 // with counters that we're going to use for analysis the the next time. 746 mc->reset_nmethod_age(); 747 } else { 748 // Method was totally idle for 10 sweeps 749 // The counter already has the initial value, flush it and may be recompile 750 // later with counters 751 } 752 } 753 } 754 755 if (make_not_entrant) { 756 nm->make_not_entrant(); 757 758 // Code cache state change is tracked in make_not_entrant() 759 if (PrintMethodFlushing && Verbose) { 760 tty->print_cr("### Nmethod %d/" PTR_FORMAT "made not-entrant: hotness counter %d/%d threshold %f", 761 nm->compile_id(), p2i(nm), nm->hotness_counter(), reset_val, threshold); 762 } 763 } 764 } 765 } 766 } 767 768 // Print out some state information about the current sweep and the 769 // state of the code cache if it's requested. 770 void NMethodSweeper::log_sweep(const char* msg, const char* format, ...) { 771 if (PrintMethodFlushing) { 772 ResourceMark rm; 773 stringStream s; 774 // Dump code cache state into a buffer before locking the tty, 775 // because log_state() will use locks causing lock conflicts. 776 CodeCache::log_state(&s); 777 778 ttyLocker ttyl; 779 tty->print("### sweeper: %s ", msg); 780 if (format != NULL) { 781 va_list ap; 782 va_start(ap, format); 783 tty->vprint(format, ap); 784 va_end(ap); 785 } 786 tty->print_cr("%s", s.as_string()); 787 } 788 789 if (LogCompilation && (xtty != NULL)) { 790 ResourceMark rm; 791 stringStream s; 792 // Dump code cache state into a buffer before locking the tty, 793 // because log_state() will use locks causing lock conflicts. 794 CodeCache::log_state(&s); 795 796 ttyLocker ttyl; 797 xtty->begin_elem("sweeper state='%s' traversals='" INTX_FORMAT "' ", msg, (intx)traversal_count()); 798 if (format != NULL) { 799 va_list ap; 800 va_start(ap, format); 801 xtty->vprint(format, ap); 802 va_end(ap); 803 } 804 xtty->print("%s", s.as_string()); 805 xtty->stamp(); 806 xtty->end_elem(); 807 } 808 } 809 810 void NMethodSweeper::print() { 811 ttyLocker ttyl; 812 tty->print_cr("Code cache sweeper statistics:"); 813 tty->print_cr(" Total sweep time: %1.0lfms", (double)_total_time_sweeping.value()/1000000); 814 tty->print_cr(" Total number of full sweeps: %ld", _total_nof_code_cache_sweeps); 815 tty->print_cr(" Total number of flushed methods: %ld(%ld C2 methods)", _total_nof_methods_reclaimed, 816 _total_nof_c2_methods_reclaimed); 817 tty->print_cr(" Total size of flushed methods: " SIZE_FORMAT "kB", _total_flushed_size/K); 818 }