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