Mercurial > hg > graal-compiler
comparison src/share/vm/code/nmethod.cpp @ 1202:5f24d0319e54
4360113: Evict nmethods when code cache gets full
Summary: Speculatively unload the oldest nmethods when code cache gets full.
Reviewed-by: never, kvn
Contributed-by: eric.caspole@amd.com
author | kvn |
---|---|
date | Fri, 29 Jan 2010 09:27:22 -0800 |
parents | 24128c2ffa87 |
children | 18a389214829 |
comparison
equal
deleted
inserted
replaced
1201:24128c2ffa87 | 1202:5f24d0319e54 |
---|---|
585 _method = method; | 585 _method = method; |
586 _entry_bci = InvocationEntryBci; | 586 _entry_bci = InvocationEntryBci; |
587 _osr_link = NULL; | 587 _osr_link = NULL; |
588 _scavenge_root_link = NULL; | 588 _scavenge_root_link = NULL; |
589 _scavenge_root_state = 0; | 589 _scavenge_root_state = 0; |
590 _saved_nmethod_link = NULL; | |
590 _compiler = NULL; | 591 _compiler = NULL; |
591 // We have no exception handler or deopt handler make the | 592 // We have no exception handler or deopt handler make the |
592 // values something that will never match a pc like the nmethod vtable entry | 593 // values something that will never match a pc like the nmethod vtable entry |
593 _exception_offset = 0; | 594 _exception_offset = 0; |
594 _deoptimize_offset = 0; | 595 _deoptimize_offset = 0; |
1031 // Ok, to lookup references to zombies here | 1032 // Ok, to lookup references to zombies here |
1032 CodeBlob *cb = CodeCache::find_blob_unsafe(ic->ic_destination()); | 1033 CodeBlob *cb = CodeCache::find_blob_unsafe(ic->ic_destination()); |
1033 if( cb != NULL && cb->is_nmethod() ) { | 1034 if( cb != NULL && cb->is_nmethod() ) { |
1034 nmethod* nm = (nmethod*)cb; | 1035 nmethod* nm = (nmethod*)cb; |
1035 // Clean inline caches pointing to both zombie and not_entrant methods | 1036 // Clean inline caches pointing to both zombie and not_entrant methods |
1036 if (!nm->is_in_use()) ic->set_to_clean(); | 1037 if (!nm->is_in_use() || (nm->method()->code() != nm)) ic->set_to_clean(); |
1037 } | 1038 } |
1038 break; | 1039 break; |
1039 } | 1040 } |
1040 case relocInfo::static_call_type: { | 1041 case relocInfo::static_call_type: { |
1041 CompiledStaticCall *csc = compiledStaticCall_at(iter.reloc()); | 1042 CompiledStaticCall *csc = compiledStaticCall_at(iter.reloc()); |
1042 CodeBlob *cb = CodeCache::find_blob_unsafe(csc->destination()); | 1043 CodeBlob *cb = CodeCache::find_blob_unsafe(csc->destination()); |
1043 if( cb != NULL && cb->is_nmethod() ) { | 1044 if( cb != NULL && cb->is_nmethod() ) { |
1044 nmethod* nm = (nmethod*)cb; | 1045 nmethod* nm = (nmethod*)cb; |
1045 // Clean inline caches pointing to both zombie and not_entrant methods | 1046 // Clean inline caches pointing to both zombie and not_entrant methods |
1046 if (!nm->is_in_use()) csc->set_to_clean(); | 1047 if (!nm->is_in_use() || (nm->method()->code() != nm)) csc->set_to_clean(); |
1047 } | 1048 } |
1048 break; | 1049 break; |
1049 } | 1050 } |
1050 } | 1051 } |
1051 } | 1052 } |
1310 check_safepoint(); | 1311 check_safepoint(); |
1311 | 1312 |
1312 // completely deallocate this method | 1313 // completely deallocate this method |
1313 EventMark m("flushing nmethod " INTPTR_FORMAT " %s", this, ""); | 1314 EventMark m("flushing nmethod " INTPTR_FORMAT " %s", this, ""); |
1314 if (PrintMethodFlushing) { | 1315 if (PrintMethodFlushing) { |
1315 tty->print_cr("*flushing nmethod " INTPTR_FORMAT ". Live blobs: %d", this, CodeCache::nof_blobs()); | 1316 tty->print_cr("*flushing nmethod %3d/" INTPTR_FORMAT ". Live blobs:" UINT32_FORMAT "/Free CodeCache:" SIZE_FORMAT "Kb", |
1317 _compile_id, this, CodeCache::nof_blobs(), CodeCache::unallocated_capacity()/1024); | |
1316 } | 1318 } |
1317 | 1319 |
1318 // We need to deallocate any ExceptionCache data. | 1320 // We need to deallocate any ExceptionCache data. |
1319 // Note that we do not need to grab the nmethod lock for this, it | 1321 // Note that we do not need to grab the nmethod lock for this, it |
1320 // better be thread safe if we're disposing of it! | 1322 // better be thread safe if we're disposing of it! |
1326 ec = next; | 1328 ec = next; |
1327 } | 1329 } |
1328 | 1330 |
1329 if (on_scavenge_root_list()) { | 1331 if (on_scavenge_root_list()) { |
1330 CodeCache::drop_scavenge_root_nmethod(this); | 1332 CodeCache::drop_scavenge_root_nmethod(this); |
1333 } | |
1334 | |
1335 if (is_speculatively_disconnected()) { | |
1336 CodeCache::remove_saved_code(this); | |
1331 } | 1337 } |
1332 | 1338 |
1333 ((CodeBlob*)(this))->flush(); | 1339 ((CodeBlob*)(this))->flush(); |
1334 | 1340 |
1335 CodeCache::free(this); | 1341 CodeCache::free(this); |