< prev index next >

src/hotspot/share/code/codeCache.cpp

Print this page

        

*** 143,153 **** #define FOR_ALL_BLOBS(cb, heap) for (CodeBlob* cb = first_blob(heap); cb != NULL; cb = next_blob(heap, cb)) address CodeCache::_low_bound = 0; address CodeCache::_high_bound = 0; int CodeCache::_number_of_nmethods_with_dependencies = 0; - nmethod* CodeCache::_scavenge_root_nmethods = NULL; ExceptionCache* volatile CodeCache::_exception_cache_purge_list = NULL; // Initialize arrays of CodeHeap subsets GrowableArray<CodeHeap*>* CodeCache::_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true); GrowableArray<CodeHeap*>* CodeCache::_compiled_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true); --- 143,152 ----
*** 709,879 **** } } } } - // Walk the list of methods which might contain oops to the java heap. - void CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure* f) { - assert_locked_or_safepoint(CodeCache_lock); - - const bool fix_relocations = f->fix_relocations(); - debug_only(mark_scavenge_root_nmethods()); - - nmethod* prev = NULL; - nmethod* cur = scavenge_root_nmethods(); - while (cur != NULL) { - debug_only(cur->clear_scavenge_root_marked()); - assert(cur->scavenge_root_not_marked(), ""); - assert(cur->on_scavenge_root_list(), "else shouldn't be on this list"); - - bool is_live = (!cur->is_zombie() && !cur->is_unloaded()); - LogTarget(Trace, gc, nmethod) lt; - if (lt.is_enabled()) { - LogStream ls(lt); - CompileTask::print(&ls, cur, - is_live ? "scavenge root " : "dead scavenge root", /*short_form:*/ true); - } - if (is_live) { - // Perform cur->oops_do(f), maybe just once per nmethod. - f->do_code_blob(cur); - } - nmethod* const next = cur->scavenge_root_link(); - // The scavengable nmethod list must contain all methods with scavengable - // oops. It is safe to include more nmethod on the list, but we do not - // expect any live non-scavengable nmethods on the list. - if (fix_relocations) { - if (!is_live || !cur->detect_scavenge_root_oops()) { - unlink_scavenge_root_nmethod(cur, prev); - } else { - prev = cur; - } - } - cur = next; - } - - // Check for stray marks. - debug_only(verify_perm_nmethods(NULL)); - } - - void CodeCache::register_scavenge_root_nmethod(nmethod* nm) { - assert_locked_or_safepoint(CodeCache_lock); - if (!nm->on_scavenge_root_list() && nm->detect_scavenge_root_oops()) { - add_scavenge_root_nmethod(nm); - } - } - - void CodeCache::verify_scavenge_root_nmethod(nmethod* nm) { - nm->verify_scavenge_root_oops(); - } - - void CodeCache::add_scavenge_root_nmethod(nmethod* nm) { - assert_locked_or_safepoint(CodeCache_lock); - - nm->set_on_scavenge_root_list(); - nm->set_scavenge_root_link(_scavenge_root_nmethods); - set_scavenge_root_nmethods(nm); - print_trace("add_scavenge_root", nm); - } - - void CodeCache::unlink_scavenge_root_nmethod(nmethod* nm, nmethod* prev) { - assert_locked_or_safepoint(CodeCache_lock); - - assert((prev == NULL && scavenge_root_nmethods() == nm) || - (prev != NULL && prev->scavenge_root_link() == nm), "precondition"); - - print_trace("unlink_scavenge_root", nm); - if (prev == NULL) { - set_scavenge_root_nmethods(nm->scavenge_root_link()); - } else { - prev->set_scavenge_root_link(nm->scavenge_root_link()); - } - nm->set_scavenge_root_link(NULL); - nm->clear_on_scavenge_root_list(); - } - - void CodeCache::drop_scavenge_root_nmethod(nmethod* nm) { - assert_locked_or_safepoint(CodeCache_lock); - - print_trace("drop_scavenge_root", nm); - nmethod* prev = NULL; - for (nmethod* cur = scavenge_root_nmethods(); cur != NULL; cur = cur->scavenge_root_link()) { - if (cur == nm) { - unlink_scavenge_root_nmethod(cur, prev); - return; - } - prev = cur; - } - assert(false, "should have been on list"); - } - - void CodeCache::prune_scavenge_root_nmethods() { - assert_locked_or_safepoint(CodeCache_lock); - - debug_only(mark_scavenge_root_nmethods()); - - nmethod* last = NULL; - nmethod* cur = scavenge_root_nmethods(); - while (cur != NULL) { - nmethod* next = cur->scavenge_root_link(); - debug_only(cur->clear_scavenge_root_marked()); - assert(cur->scavenge_root_not_marked(), ""); - assert(cur->on_scavenge_root_list(), "else shouldn't be on this list"); - - if (!cur->is_zombie() && !cur->is_unloaded() - && cur->detect_scavenge_root_oops()) { - // Keep it. Advance 'last' to prevent deletion. - last = cur; - } else { - // Prune it from the list, so we don't have to look at it any more. - print_trace("prune_scavenge_root", cur); - unlink_scavenge_root_nmethod(cur, last); - } - cur = next; - } - - // Check for stray marks. - debug_only(verify_perm_nmethods(NULL)); - } - - #ifndef PRODUCT - void CodeCache::asserted_non_scavengable_nmethods_do(CodeBlobClosure* f) { - // While we are here, verify the integrity of the list. - mark_scavenge_root_nmethods(); - for (nmethod* cur = scavenge_root_nmethods(); cur != NULL; cur = cur->scavenge_root_link()) { - assert(cur->on_scavenge_root_list(), "else shouldn't be on this list"); - cur->clear_scavenge_root_marked(); - } - verify_perm_nmethods(f); - } - - // Temporarily mark nmethods that are claimed to be on the scavenge list. - void CodeCache::mark_scavenge_root_nmethods() { - NMethodIterator iter(NMethodIterator::only_alive); - while(iter.next()) { - nmethod* nm = iter.method(); - assert(nm->scavenge_root_not_marked(), "clean state"); - if (nm->on_scavenge_root_list()) - nm->set_scavenge_root_marked(); - } - } - - // If the closure is given, run it on the unlisted nmethods. - // Also make sure that the effects of mark_scavenge_root_nmethods is gone. - void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) { - NMethodIterator iter(NMethodIterator::only_alive); - while(iter.next()) { - nmethod* nm = iter.method(); - bool call_f = (f_or_null != NULL); - assert(nm->scavenge_root_not_marked(), "must be already processed"); - if (nm->on_scavenge_root_list()) - call_f = false; // don't show this one to the client - Universe::heap()->verify_nmethod(nm); - if (call_f) f_or_null->do_code_blob(nm); - } - } - #endif //PRODUCT - void CodeCache::verify_clean_inline_caches() { #ifdef ASSERT NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading); while(iter.next()) { nmethod* nm = iter.method(); --- 708,717 ----
*** 927,942 **** curr = next; } _exception_cache_purge_list = NULL; } - void CodeCache::gc_prologue() { } - - void CodeCache::gc_epilogue() { - prune_scavenge_root_nmethods(); - } - uint8_t CodeCache::_unloading_cycle = 1; void CodeCache::increment_unloading_cycle() { if (_unloading_cycle == 1) { _unloading_cycle = 2; --- 765,774 ----
< prev index next >