代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/openjdk-17 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 1fe9667bb594b66f7363cec246ebc99cd0ac9103 Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2023 16:43:24 +0800
Subject: add Parallel-Full-gc-mark-stack-draining-should
---
.../share/gc/parallel/psCompactionManager.cpp | 18 +++++++++++++++---
.../share/gc/parallel/psCompactionManager.hpp | 1 +
.../share/gc/parallel/psParallelCompact.cpp | 12 +++++-------
3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.cpp b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
index 117817caa..b2c17140d 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.cpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
@@ -115,12 +115,24 @@ ParCompactionManager::gc_thread_compaction_manager(uint index) {
return _manager_array[index];
}
+bool ParCompactionManager::transfer_from_overflow_stack(ObjArrayTask& task) {
+ while (_objarray_stack.pop_overflow(task)) {
+ if (!_objarray_stack.try_push_to_taskqueue(task)) {
+ return true;
+ }
+ }
+ return false;
+}
+
void ParCompactionManager::follow_marking_stacks() {
do {
- // Drain the overflow stack first, to allow stealing from the marking stack.
+ // First, try to move tasks from the overflow stack into the shared buffer, so
+ // that other threads can steal. Otherwise process the overflow stack first.
oop obj;
while (marking_stack()->pop_overflow(obj)) {
- follow_contents(obj);
+ if (!marking_stack()->try_push_to_taskqueue(obj)) {
+ follow_contents(obj);
+ }
}
while (marking_stack()->pop_local(obj)) {
follow_contents(obj);
@@ -128,7 +140,7 @@ void ParCompactionManager::follow_marking_stacks() {
// Process ObjArrays one at a time to avoid marking stack bloat.
ObjArrayTask task;
- if (_objarray_stack.pop_overflow(task) || _objarray_stack.pop_local(task)) {
+ if (transfer_from_overflow_stack(task) || _objarray_stack.pop_local(task)) {
follow_array((objArrayOop)task.obj(), task.index());
}
} while (!marking_stacks_empty());
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
index a73e898f0..12b5d891d 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
@@ -94,6 +94,7 @@ class ParCompactionManager : public CHeapObj<mtGC> {
static void initialize(ParMarkBitMap* mbm);
+ bool transfer_from_overflow_stack(ObjArrayTask& task);
protected:
// Array of task queues. Needed by the task terminator.
static RegionTaskQueueSet* region_task_queues() { return _region_task_queues; }
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
index 8cf13bd1d..3c276db70 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
@@ -2002,17 +2002,15 @@ void steal_marking_work(TaskTerminator& terminator, uint worker_id) {
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(worker_id);
- oop obj = NULL;
- ObjArrayTask task;
do {
- while (ParCompactionManager::steal_objarray(worker_id, task)) {
+ oop obj = NULL;
+ ObjArrayTask task;
+ if (ParCompactionManager::steal_objarray(worker_id, task)) {
cm->follow_array((objArrayOop)task.obj(), task.index());
- cm->follow_marking_stacks();
- }
- while (ParCompactionManager::steal(worker_id, obj)) {
+ } else if (ParCompactionManager::steal(worker_id, obj)) {
cm->follow_contents(obj);
- cm->follow_marking_stacks();
}
+ cm->follow_marking_stacks();
} while (!terminator.offer_termination());
}
--
2.22.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。