Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8297487: G1 Remark: no need to keep alive oop constants of nmethods on stack #11314

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1779,30 +1779,17 @@ class G1CMSATBBufferClosure : public SATBBufferClosure {

class G1RemarkThreadsClosure : public ThreadClosure {
G1SATBMarkQueueSet& _qset;
G1CMOopClosure _cm_cl;
MarkingCodeBlobClosure _code_cl;
uintx _claim_token;

public:
G1RemarkThreadsClosure(G1CollectedHeap* g1h, G1CMTask* task) :
_qset(G1BarrierSet::satb_mark_queue_set()),
_cm_cl(g1h, task),
_code_cl(&_cm_cl, !CodeBlobToOopClosure::FixRelocations, true /* keepalive nmethods */),
_claim_token(Threads::thread_claim_token()) {}

void do_thread(Thread* thread) {
if (thread->claim_threads_do(true, _claim_token)) {
// Transfer any partial buffer to the qset for completed buffer processing.
_qset.flush_queue(G1ThreadLocalData::satb_mark_queue(thread));
if (thread->is_Java_thread()) {
// In theory it should not be necessary to explicitly walk the nmethods to find roots for concurrent marking
// however the liveness of oops reachable from nmethods have very complex lifecycles:
// * Alive if on the stack of an executing method
// * Weakly reachable otherwise
// Some objects reachable from nmethods, such as the class loader (or klass_holder) of the receiver should be
// live by the SATB invariant but other oops recorded in nmethods may behave differently.
JavaThread::cast(thread)->nmethods_do(&_code_cl);
}
}
}
};
Expand Down
5 changes: 3 additions & 2 deletions src/hotspot/share/gc/shared/barrierSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ static BarrierSetNMethod* select_barrier_set_nmethod(BarrierSetNMethod* barrier_
// The GC needs nmethod entry barriers to do concurrent GC
return barrier_set_nmethod;
} else {
// The GC needs nmethod entry barriers to deal with continuations
// and code cache unloading
// The GC needs nmethod entry barriers for code cache unloading (recently
// used heuristics) and, if it's a SATB GC, to keep alive constant objects
// of nmethods because they are weakly referenced.
return new BarrierSetNMethod();
}
}
Expand Down