mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8040803: G1: Concurrent mark hangs when mark stack overflows
Reviewed-by: brutisso, ehelin
This commit is contained in:
parent
6049e98a0e
commit
3f35cb0ca0
3 changed files with 51 additions and 15 deletions
|
@ -978,7 +978,9 @@ void ConcurrentMark::enter_first_sync_barrier(uint worker_id) {
|
|||
if (concurrent()) {
|
||||
SuspendibleThreadSet::leave();
|
||||
}
|
||||
_first_overflow_barrier_sync.enter();
|
||||
|
||||
bool barrier_aborted = !_first_overflow_barrier_sync.enter();
|
||||
|
||||
if (concurrent()) {
|
||||
SuspendibleThreadSet::join();
|
||||
}
|
||||
|
@ -986,7 +988,17 @@ void ConcurrentMark::enter_first_sync_barrier(uint worker_id) {
|
|||
// more work
|
||||
|
||||
if (verbose_low()) {
|
||||
gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id);
|
||||
if (barrier_aborted) {
|
||||
gclog_or_tty->print_cr("[%u] aborted first barrier", worker_id);
|
||||
} else {
|
||||
gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (barrier_aborted) {
|
||||
// If the barrier aborted we ignore the overflow condition and
|
||||
// just abort the whole marking phase as quickly as possible.
|
||||
return;
|
||||
}
|
||||
|
||||
// If we're executing the concurrent phase of marking, reset the marking
|
||||
|
@ -1026,14 +1038,20 @@ void ConcurrentMark::enter_second_sync_barrier(uint worker_id) {
|
|||
if (concurrent()) {
|
||||
SuspendibleThreadSet::leave();
|
||||
}
|
||||
_second_overflow_barrier_sync.enter();
|
||||
|
||||
bool barrier_aborted = !_second_overflow_barrier_sync.enter();
|
||||
|
||||
if (concurrent()) {
|
||||
SuspendibleThreadSet::join();
|
||||
}
|
||||
// at this point everything should be re-initialized and ready to go
|
||||
|
||||
if (verbose_low()) {
|
||||
gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id);
|
||||
if (barrier_aborted) {
|
||||
gclog_or_tty->print_cr("[%u] aborted second barrier", worker_id);
|
||||
} else {
|
||||
gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3240,6 +3258,8 @@ void ConcurrentMark::abort() {
|
|||
for (uint i = 0; i < _max_worker_id; ++i) {
|
||||
_tasks[i]->clear_region_fields();
|
||||
}
|
||||
_first_overflow_barrier_sync.abort();
|
||||
_second_overflow_barrier_sync.abort();
|
||||
_has_aborted = true;
|
||||
|
||||
SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue