< prev index next >
src/hotspot/share/runtime/sweeper.cpp
Concurrent class unloading
public:
CompiledMethodMarker(CompiledMethod* cm) {
JavaThread* current = JavaThread::current();
assert (current->is_Code_cache_sweeper_thread(), "Must be");
_thread = (CodeCacheSweeperThread*)current;
! if (!cm->is_zombie() && !cm->is_unloaded()) {
// Only expose live nmethods for scanning
_thread->set_scanned_compiled_method(cm);
}
}
~CompiledMethodMarker() {
public:
CompiledMethodMarker(CompiledMethod* cm) {
JavaThread* current = JavaThread::current();
assert (current->is_Code_cache_sweeper_thread(), "Must be");
_thread = (CodeCacheSweeperThread*)current;
! if (!cm->is_zombie() && !cm->is_unloading()) {
// Only expose live nmethods for scanning
_thread->set_scanned_compiled_method(cm);
}
}
~CompiledMethodMarker() {
***************
SWEEP(cm);
// Skip methods that are currently referenced by the VM
if (cm->is_locked_by_vm()) {
// But still remember to clean-up inline caches for alive nmethods
! if (cm->is_alive()) {
// Clean inline caches that point to zombie/non-entrant/unloaded nmethods
MutexLocker cl(CompiledIC_lock);
cm->cleanup_inline_caches(false);
SWEEP(cm);
}
SWEEP(cm);
// Skip methods that are currently referenced by the VM
if (cm->is_locked_by_vm()) {
// But still remember to clean-up inline caches for alive nmethods
! if (cm->is_alive() && !cm->is_unloading()) {
// Clean inline caches that point to zombie/non-entrant/unloaded nmethods
MutexLocker cl(CompiledIC_lock);
cm->cleanup_inline_caches(false);
SWEEP(cm);
}
< prev index next >