Mercurial > hg > truffle
comparison src/share/vm/code/codeCache.cpp @ 10206:0cfa93c2fcc4
8012547: Code cache flushing can get stuck reclaming of memory
Summary: Keep sweeping regardless of if we are flushing
Reviewed-by: kvn, twisti
author | neliasso |
---|---|
date | Mon, 29 Apr 2013 13:20:19 +0200 |
parents | a7fb14888912 |
children | 91eba9f82325 |
comparison
equal
deleted
inserted
replaced
10205:62b683108582 | 10206:0cfa93c2fcc4 |
---|---|
461 if (call_f) f_or_null->do_code_blob(cb); | 461 if (call_f) f_or_null->do_code_blob(cb); |
462 } | 462 } |
463 } | 463 } |
464 #endif //PRODUCT | 464 #endif //PRODUCT |
465 | 465 |
466 | 466 /** |
467 nmethod* CodeCache::find_and_remove_saved_code(Method* m) { | 467 * Remove and return nmethod from the saved code list in order to reanimate it. |
468 */ | |
469 nmethod* CodeCache::reanimate_saved_code(Method* m) { | |
468 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); | 470 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
469 nmethod* saved = _saved_nmethods; | 471 nmethod* saved = _saved_nmethods; |
470 nmethod* prev = NULL; | 472 nmethod* prev = NULL; |
471 while (saved != NULL) { | 473 while (saved != NULL) { |
472 if (saved->is_in_use() && saved->method() == m) { | 474 if (saved->is_in_use() && saved->method() == m) { |
477 } | 479 } |
478 assert(saved->is_speculatively_disconnected(), "shouldn't call for other nmethods"); | 480 assert(saved->is_speculatively_disconnected(), "shouldn't call for other nmethods"); |
479 saved->set_speculatively_disconnected(false); | 481 saved->set_speculatively_disconnected(false); |
480 saved->set_saved_nmethod_link(NULL); | 482 saved->set_saved_nmethod_link(NULL); |
481 if (PrintMethodFlushing) { | 483 if (PrintMethodFlushing) { |
482 saved->print_on(tty, " ### nmethod is reconnected\n"); | 484 saved->print_on(tty, " ### nmethod is reconnected"); |
483 } | 485 } |
484 if (LogCompilation && (xtty != NULL)) { | 486 if (LogCompilation && (xtty != NULL)) { |
485 ttyLocker ttyl; | 487 ttyLocker ttyl; |
486 xtty->begin_elem("nmethod_reconnected compile_id='%3d'", saved->compile_id()); | 488 xtty->begin_elem("nmethod_reconnected compile_id='%3d'", saved->compile_id()); |
487 xtty->method(m); | 489 xtty->method(m); |
494 saved = saved->saved_nmethod_link(); | 496 saved = saved->saved_nmethod_link(); |
495 } | 497 } |
496 return NULL; | 498 return NULL; |
497 } | 499 } |
498 | 500 |
501 /** | |
502 * Remove nmethod from the saved code list in order to discard it permanently | |
503 */ | |
499 void CodeCache::remove_saved_code(nmethod* nm) { | 504 void CodeCache::remove_saved_code(nmethod* nm) { |
500 // For conc swpr this will be called with CodeCache_lock taken by caller | 505 // For conc swpr this will be called with CodeCache_lock taken by caller |
501 assert_locked_or_safepoint(CodeCache_lock); | 506 assert_locked_or_safepoint(CodeCache_lock); |
502 assert(nm->is_speculatively_disconnected(), "shouldn't call for other nmethods"); | 507 assert(nm->is_speculatively_disconnected(), "shouldn't call for other nmethods"); |
503 nmethod* saved = _saved_nmethods; | 508 nmethod* saved = _saved_nmethods; |
527 assert_locked_or_safepoint(CodeCache_lock); | 532 assert_locked_or_safepoint(CodeCache_lock); |
528 assert(nm->is_in_use() && !nm->is_speculatively_disconnected(), "should only disconnect live nmethods"); | 533 assert(nm->is_in_use() && !nm->is_speculatively_disconnected(), "should only disconnect live nmethods"); |
529 nm->set_saved_nmethod_link(_saved_nmethods); | 534 nm->set_saved_nmethod_link(_saved_nmethods); |
530 _saved_nmethods = nm; | 535 _saved_nmethods = nm; |
531 if (PrintMethodFlushing) { | 536 if (PrintMethodFlushing) { |
532 nm->print_on(tty, " ### nmethod is speculatively disconnected\n"); | 537 nm->print_on(tty, " ### nmethod is speculatively disconnected"); |
533 } | 538 } |
534 if (LogCompilation && (xtty != NULL)) { | 539 if (LogCompilation && (xtty != NULL)) { |
535 ttyLocker ttyl; | 540 ttyLocker ttyl; |
536 xtty->begin_elem("nmethod_disconnected compile_id='%3d'", nm->compile_id()); | 541 xtty->begin_elem("nmethod_disconnected compile_id='%3d'", nm->compile_id()); |
537 xtty->method(nm->method()); | 542 xtty->method(nm->method()); |