< 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 >