Loading... (original) (raw)
changed the implementation CodeCache::gc_epilogue() to also clean ICs of unloaded nmethods. Since this code is executed at a safepoint if may increase safepoint duration. A better solution is to do the cleaning in the sweeper:
diff -r c0ea5537dc8b src/share/vm/runtime/sweeper.cpp
--- a/src/share/vm/runtime/sweeper.cpp Tue Aug 25 07:49:55 2015 +0200
+++ b/src/share/vm/runtime/sweeper.cpp Wed Aug 26 12:56:55 2015 +0200
@@ -645,6 +645,12 @@
assert(result == None, "sanity");
result = Flushed;
} else {
+ {
+ // Clean ICs of unloaded nmethods as well because they may reference other
+ // unloaded nmethods that may be flushed earlier in the sweeper cycle.
+ MutexLocker cl(CompiledIC_lock);
+ nm->cleanup_inline_caches();
+ }
// Code cache state change is tracked in make_zombie()
nm->make_zombie();
SWEEP(nm);
Martin Doerr also mentioned some other potential problems with method unloading [1]:
"Additionally, it may be required to adapt a couple of assertions.
We modified the following ASSERT code (based on hotspot 25)
1. in CompiledIC::is_call_to_compiled():
Accessing cached_metadata() may be unsafe if !caller->is_alive().
2. in CompiledIC::is_call_to_interpreted():
CodeBlob* db may be gone if cb is unloaded.
3. in CompiledIC::verify():
is_call_to_compiled() has crashed. Seems to be unsafe in megamorphic case so we changed the order of the checks.
4. in nmethod::verify_clean_inline_caches():
In case of relocInfo::virtual_call_type CompiledIC may still point to a zombie method."
[1] http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2015-August/018744.html