diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index 1f84feb20e8..731868310f4 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -183,6 +183,29 @@ void ShenandoahGenerationalHeap::stop() { regulator_thread()->stop(); } +bool ShenandoahGenerationalHeap::requires_barriers(stackChunkOop obj) const { + if (is_idle()) { + return false; + } + + if (is_concurrent_young_mark_in_progress() && is_in_young(obj) && !marking_context()->allocated_after_mark_start(obj)) { + // We are marking young, this object is in young, and it is below the TAMS + return true; + } + + if (is_in_old(obj)) { + // Card marking barriers are required for objects in the old generation + return true; + } + + if (has_forwarded_objects()) { + // Object may have pointers that need to be updated + return true; + } + + return false; +} + void ShenandoahGenerationalHeap::evacuate_collection_set(bool concurrent) { ShenandoahRegionIterator regions; ShenandoahGenerationalEvacuationTask task(this, ®ions, concurrent, false /* only promote regions */); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp index cef5dfd7070..ed5a6f3d9a5 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp @@ -128,6 +128,8 @@ public: void stop() override; + bool requires_barriers(stackChunkOop obj) const override; + // Used for logging the result of a region transfer outside the heap lock struct TransferResult { bool success;