--- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp Fri Mar 29 15:59:28 2019 +0100
+++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp Tue Mar 26 12:12:49 2019 -0400
@@ -120,11 +120,10 @@
CLDToOopClosure clds_cl(oops, ClassLoaderData::_claim_strong);
MarkingCodeBlobClosure blobs_cl(oops, ! CodeBlobToOopClosure::FixRelocations);
- OopClosure* weak_oops = _process_refs ? NULL : oops;
ResourceMark m;
if (heap->unload_classes()) {
- _rp->process_strong_roots(oops, weak_oops, &clds_cl, NULL, &blobs_cl, NULL, worker_id);
+ _rp->process_strong_roots(oops, &clds_cl, NULL, &blobs_cl, NULL, worker_id);
} else {
if (ShenandoahConcurrentScanCodeRoots) {
CodeBlobClosure* code_blobs = NULL;
@@ -137,9 +136,9 @@
code_blobs = &assert_to_space;
}
#endif
- _rp->process_all_roots(oops, weak_oops, &clds_cl, code_blobs, NULL, worker_id);
+ _rp->process_all_roots(oops, &clds_cl, code_blobs, NULL, worker_id);
} else {
- _rp->process_all_roots(oops, weak_oops, &clds_cl, &blobs_cl, NULL, worker_id);
+ _rp->process_all_roots(oops, &clds_cl, &blobs_cl, NULL, worker_id);
}
}
}
@@ -177,7 +176,7 @@
DEBUG_ONLY(&assert_to_space)
NOT_DEBUG(NULL);
}
- _rp->process_all_roots(&cl, &cl, &cldCl, code_blobs, NULL, worker_id);
+ _rp->update_all_roots(&cl, &cldCl, code_blobs, NULL, worker_id);
}
};
@@ -446,11 +445,16 @@
weak_refs_work(full_gc);
}
+ weak_roots_work();
+
// And finally finish class unloading
if (_heap->unload_classes()) {
_heap->unload_classes_and_cleanup_tables(full_gc);
+ } else if (ShenandoahStringDedup::is_enabled()) {
+ ShenandoahIsAliveSelector alive;
+ BoolObjectClosure* is_alive = alive.is_alive_closure();
+ ShenandoahStringDedup::unlink_or_oops_do(is_alive, NULL, false);
}
-
assert(task_queues()->is_empty(), "Should be empty");
TASKQUEUE_STATS_ONLY(task_queues()->print_taskqueue_stats());
TASKQUEUE_STATS_ONLY(task_queues()->reset_taskqueue_stats());
@@ -555,11 +559,13 @@
private:
template <class T>
inline void do_oop_work(T* p) {
+#ifdef ASSERT
T o = RawAccess<>::oop_load(p);
if (!CompressedOops::is_null(o)) {
oop obj = CompressedOops::decode_not_null(o);
shenandoah_assert_not_forwarded(p, obj);
}
+#endif
}
public:
@@ -648,6 +654,23 @@
}
+// Process leftover weak oops: update them, if needed or assert they do not
+// need updating otherwise.
+// Weak processor API requires us to visit the oops, even if we are not doing
+// anything to them.
+void ShenandoahConcurrentMark::weak_roots_work() {
+ WorkGang* workers = _heap->workers();
+ ShenandoahIsAliveSelector is_alive;
+
+ if (_heap->has_forwarded_objects()) {
+ ShenandoahWeakUpdateClosure cl;
+ WeakProcessor::weak_oops_do(workers, is_alive.is_alive_closure(), &cl, 1);
+ } else {
+ ShenandoahWeakAssertNotForwardedClosure cl;
+ WeakProcessor::weak_oops_do(workers, is_alive.is_alive_closure(), &cl, 1);
+ }
+}
+
void ShenandoahConcurrentMark::weak_refs_work_doit(bool full_gc) {
ReferenceProcessor* rp = _heap->ref_processor();
@@ -689,26 +712,18 @@
ShenandoahGCPhase phase(phase_process);
ShenandoahTerminationTracker phase_term(phase_process_termination);
- // Process leftover weak oops: update them, if needed (using parallel version),
- // or assert they do not need updating (using serial version) otherwise.
- // Weak processor API requires us to visit the oops, even if we are not doing
- // anything to them.
if (_heap->has_forwarded_objects()) {
ShenandoahCMKeepAliveUpdateClosure keep_alive(get_queue(serial_worker_id));
rp->process_discovered_references(is_alive.is_alive_closure(), &keep_alive,
&complete_gc, &executor,
&pt);
- ShenandoahWeakUpdateClosure cl;
- WeakProcessor::weak_oops_do(workers, is_alive.is_alive_closure(), &cl, 1);
} else {
ShenandoahCMKeepAliveClosure keep_alive(get_queue(serial_worker_id));
rp->process_discovered_references(is_alive.is_alive_closure(), &keep_alive,
&complete_gc, &executor,
&pt);
- ShenandoahWeakAssertNotForwardedClosure cl;
- WeakProcessor::weak_oops_do(is_alive.is_alive_closure(), &cl);
}
pt.print_all_references();