mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 09:34:38 +02:00
8220465: Use shadow regions for faster ParallelGC full GCs
Reviewed-by: sjohanss, tschatzl
This commit is contained in:
parent
026eac269c
commit
7eadf5b372
4 changed files with 326 additions and 40 deletions
|
@ -49,6 +49,8 @@ ParCompactionManager::ObjArrayTaskQueueSet*
|
|||
ObjectStartArray* ParCompactionManager::_start_array = NULL;
|
||||
ParMarkBitMap* ParCompactionManager::_mark_bitmap = NULL;
|
||||
RegionTaskQueueSet* ParCompactionManager::_region_array = NULL;
|
||||
GrowableArray<size_t >* ParCompactionManager::_shadow_region_array = NULL;
|
||||
Monitor* ParCompactionManager::_shadow_region_monitor = NULL;
|
||||
|
||||
ParCompactionManager::ParCompactionManager() :
|
||||
_action(CopyAndUpdate) {
|
||||
|
@ -99,6 +101,11 @@ void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
|
|||
"Could not create ParCompactionManager");
|
||||
assert(ParallelScavengeHeap::heap()->workers().total_workers() != 0,
|
||||
"Not initialized?");
|
||||
|
||||
_shadow_region_array = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<size_t >(10, true);
|
||||
|
||||
_shadow_region_monitor = new Monitor(Mutex::barrier, "CompactionManager monitor",
|
||||
Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never);
|
||||
}
|
||||
|
||||
void ParCompactionManager::reset_all_bitmap_query_caches() {
|
||||
|
@ -163,3 +170,33 @@ void ParCompactionManager::drain_region_stacks() {
|
|||
}
|
||||
} while (!region_stack()->is_empty());
|
||||
}
|
||||
|
||||
size_t ParCompactionManager::pop_shadow_region_mt_safe(PSParallelCompact::RegionData* region_ptr) {
|
||||
MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag);
|
||||
while (true) {
|
||||
if (!_shadow_region_array->is_empty()) {
|
||||
return _shadow_region_array->pop();
|
||||
}
|
||||
// Check if the corresponding heap region is available now.
|
||||
// If so, we don't need to get a shadow region anymore, and
|
||||
// we return InvalidShadow to indicate such a case.
|
||||
if (region_ptr->claimed()) {
|
||||
return InvalidShadow;
|
||||
}
|
||||
ml.wait(1);
|
||||
}
|
||||
}
|
||||
|
||||
void ParCompactionManager::push_shadow_region_mt_safe(size_t shadow_region) {
|
||||
MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag);
|
||||
_shadow_region_array->push(shadow_region);
|
||||
ml.notify();
|
||||
}
|
||||
|
||||
void ParCompactionManager::push_shadow_region(size_t shadow_region) {
|
||||
_shadow_region_array->push(shadow_region);
|
||||
}
|
||||
|
||||
void ParCompactionManager::remove_all_shadow_regions() {
|
||||
_shadow_region_array->clear();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue