< prev index next >
src/hotspot/share/gc/z/zHeap.cpp
Print this page
*** 23,32 ****
--- 23,33 ----
#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,393 ****
--- 385,410 ----
// 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,421 ****
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 */);
}
}
// Allow pages to be deleted
_page_allocator.disable_deferred_delete();
// Select pages to relocate
selector.select(&_relocation_set);
// Setup forwarding table
ZRelocationSetIterator rs_iter(&_relocation_set);
--- 418,439 ----
if (page->is_marked()) {
// Register live page
selector.register_live_page(page);
} else {
! // 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 >