8234654: ZGC: Only disarm NMethods when marking/relocating code roots
Reviewed-by: eosterlund, stefank
This commit is contained in:
parent
c04194036b
commit
6ad37680dd
src/hotspot/share/gc/z
@ -140,6 +140,10 @@ public:
|
||||
ZThreadLocalAllocBuffer::retire(thread);
|
||||
}
|
||||
|
||||
virtual bool should_disarm_nmethods() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void do_oop(oop* p) {
|
||||
ZBarrier::mark_barrier_on_root_oop_field(p);
|
||||
}
|
||||
|
@ -163,7 +163,7 @@ void ZNMethod::register_nmethod(nmethod* nm) {
|
||||
ZNMethodTable::register_nmethod(nm);
|
||||
|
||||
// Disarm nmethod entry barrier
|
||||
disarm_nmethod(nm);
|
||||
disarm(nm);
|
||||
}
|
||||
|
||||
void ZNMethod::unregister_nmethod(nmethod* nm) {
|
||||
@ -187,7 +187,16 @@ void ZNMethod::flush_nmethod(nmethod* nm) {
|
||||
delete gc_data(nm);
|
||||
}
|
||||
|
||||
void ZNMethod::disarm_nmethod(nmethod* nm) {
|
||||
bool ZNMethod::is_armed(nmethod* nm) {
|
||||
BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
|
||||
if (bs != NULL) {
|
||||
return bs->is_armed(nm);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ZNMethod::disarm(nmethod* nm) {
|
||||
BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
|
||||
if (bs != NULL) {
|
||||
bs->disarm(nm);
|
||||
@ -301,10 +310,12 @@ public:
|
||||
|
||||
ZLocker<ZReentrantLock> locker(ZNMethod::lock_for_nmethod(nm));
|
||||
|
||||
// Heal oops and disarm
|
||||
ZNMethodOopClosure cl;
|
||||
ZNMethod::nmethod_oops_do(nm, &cl);
|
||||
ZNMethod::disarm_nmethod(nm);
|
||||
if (ZNMethod::is_armed(nm)) {
|
||||
// Heal oops and disarm
|
||||
ZNMethodOopClosure cl;
|
||||
ZNMethod::nmethod_oops_do(nm, &cl);
|
||||
ZNMethod::disarm(nm);
|
||||
}
|
||||
|
||||
// Clear compiled ICs and exception caches
|
||||
if (!nm->unload_nmethod_caches(_unloading_occurred)) {
|
||||
|
@ -43,7 +43,8 @@ public:
|
||||
static void unregister_nmethod(nmethod* nm);
|
||||
static void flush_nmethod(nmethod* nm);
|
||||
|
||||
static void disarm_nmethod(nmethod* nm);
|
||||
static bool is_armed(nmethod* nm);
|
||||
static void disarm(nmethod* nm);
|
||||
|
||||
static void nmethod_oops_do(nmethod* nm, OopClosure* cl);
|
||||
|
||||
|
@ -56,6 +56,10 @@ public:
|
||||
ZThreadLocalAllocBuffer::remap(thread);
|
||||
}
|
||||
|
||||
virtual bool should_disarm_nmethods() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void do_oop(oop* p) {
|
||||
ZBarrier::relocate_barrier_on_root_oop_field(p);
|
||||
}
|
||||
|
@ -139,27 +139,31 @@ void ZParallelWeakOopsDo<T, F>::weak_oops_do(BoolObjectClosure* is_alive, ZRoots
|
||||
}
|
||||
}
|
||||
|
||||
class ZRootsIteratorCodeBlobClosure : public CodeBlobToOopClosure {
|
||||
class ZRootsIteratorCodeBlobClosure : public CodeBlobClosure {
|
||||
private:
|
||||
BarrierSetNMethod* _bs;
|
||||
ZRootsIteratorClosure* const _cl;
|
||||
const bool _should_disarm_nmethods;
|
||||
|
||||
public:
|
||||
ZRootsIteratorCodeBlobClosure(OopClosure* cl) :
|
||||
CodeBlobToOopClosure(cl, true /* fix_relocations */),
|
||||
_bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {}
|
||||
ZRootsIteratorCodeBlobClosure(ZRootsIteratorClosure* cl) :
|
||||
_cl(cl),
|
||||
_should_disarm_nmethods(cl->should_disarm_nmethods()) {}
|
||||
|
||||
virtual void do_code_blob(CodeBlob* cb) {
|
||||
nmethod* const nm = cb->as_nmethod_or_null();
|
||||
if (nm != NULL && nm->oops_do_try_claim()) {
|
||||
CodeBlobToOopClosure::do_code_blob(cb);
|
||||
_bs->disarm(nm);
|
||||
ZNMethod::nmethod_oops_do(nm, _cl);
|
||||
assert(ZNMethod::is_armed(nm) == _should_disarm_nmethods, "Invalid state");
|
||||
if (_should_disarm_nmethods) {
|
||||
ZNMethod::disarm(nm);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class ZRootsIteratorThreadClosure : public ThreadClosure {
|
||||
private:
|
||||
ZRootsIteratorClosure* _cl;
|
||||
ZRootsIteratorClosure* const _cl;
|
||||
|
||||
public:
|
||||
ZRootsIteratorThreadClosure(ZRootsIteratorClosure* cl) :
|
||||
|
@ -31,10 +31,7 @@
|
||||
#include "runtime/thread.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
|
||||
class ZRootsIteratorClosure : public OopClosure {
|
||||
public:
|
||||
virtual void do_thread(Thread* thread) {}
|
||||
};
|
||||
class ZRootsIteratorClosure;
|
||||
|
||||
typedef OopStorage::ParState<true /* concurrent */, false /* is_const */> ZOopStorageIterator;
|
||||
|
||||
@ -82,9 +79,18 @@ public:
|
||||
void weak_oops_do(BoolObjectClosure* is_alive, ZRootsIteratorClosure* cl);
|
||||
};
|
||||
|
||||
class ZRootsIteratorClosure : public OopClosure {
|
||||
public:
|
||||
virtual void do_thread(Thread* thread) {}
|
||||
|
||||
virtual bool should_disarm_nmethods() const {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class ZRootsIterator {
|
||||
private:
|
||||
bool _visit_jvmti_weak_export;
|
||||
const bool _visit_jvmti_weak_export;
|
||||
|
||||
void do_universe(ZRootsIteratorClosure* cl);
|
||||
void do_object_synchronizer(ZRootsIteratorClosure* cl);
|
||||
|
Loading…
x
Reference in New Issue
Block a user