< prev index next >

src/hotspot/share/gc/z/zHeap.cpp

Print this page

        

@@ -23,10 +23,11 @@
 
 #include "precompiled.hpp"
 #include "gc/shared/gcArguments.hpp"
 #include "gc/shared/oopStorage.hpp"
 #include "gc/z/zAddress.hpp"
+#include "gc/z/zArray.inline.hpp"
 #include "gc/z/zGlobals.hpp"
 #include "gc/z/zHeap.inline.hpp"
 #include "gc/z/zHeapIterator.hpp"
 #include "gc/z/zList.inline.hpp"
 #include "gc/z/zLock.inline.hpp"

@@ -384,10 +385,26 @@
   // during the resurrection block window, since such referents
   // are only Finalizable marked.
   _reference_processor.enqueue_references();
 }
 
+class ZHeapReclaimPagesTask : public ZTask {
+private:
+  ZArrayParallelIterator<ZPage*> _iter;
+
+public:
+  ZHeapReclaimPagesTask(ZArray<ZPage*>* pages) :
+      ZTask("ZHeapReclaimPagesTask"),
+      _iter(pages) {}
+
+  virtual void work() {
+    for (ZPage* page; _iter.next(&page);) {
+      ZHeap::heap()->free_page(page, true /* reclaimed */);
+    }
+  }
+};
+
 void ZHeap::select_relocation_set() {
   // Do not allow pages to be deleted
   _page_allocator.enable_deferred_delete();
 
   // Register relocatable pages with selector

@@ -401,21 +418,22 @@
 
     if (page->is_marked()) {
       // Register live page
       selector.register_live_page(page);
     } else {
-      // Register garbage page
-      selector.register_garbage_page(page);
-
-      // Reclaim page immediately
-      free_page(page, true /* reclaimed */);
+      // Register reclaimable page
+      selector.register_reclaimable_page(page);
     }
   }
 
   // Allow pages to be deleted
   _page_allocator.disable_deferred_delete();
 
+  // Free reclaimable page
+  ZHeapReclaimPagesTask task(selector.reclaimable());
+  _workers.run_concurrent(&task);
+
   // Select pages to relocate
   selector.select(&_relocation_set);
 
   // Setup forwarding table
   ZRelocationSetIterator rs_iter(&_relocation_set);
< prev index next >