--- old/src/hotspot/share/gc/z/zHeap.cpp 2019-07-26 14:17:43.948820090 +0200 +++ new/src/hotspot/share/gc/z/zHeap.cpp 2019-07-26 14:17:43.678811210 +0200 @@ -25,6 +25,7 @@ #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" @@ -386,6 +387,22 @@ _reference_processor.enqueue_references(); } +class ZHeapReclaimPagesTask : public ZTask { +private: + ZArrayParallelIterator _iter; + +public: + ZHeapReclaimPagesTask(ZArray* 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(); @@ -403,17 +420,18 @@ // 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);