mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 18:14:38 +02:00
7192128: G1: Extend fix for 6948537 to G1's BOT
G1 does not appear to be immune to the issue described in CR 6948537 and increasing the size of old-generation PLABs appears to increase the liklihood of seeing the issue. Extend the fix for 6948537 to G1's BlockOffsetTable. Reviewed-by: brutisso, jmasa
This commit is contained in:
parent
b11a680280
commit
384650cb3e
3 changed files with 32 additions and 8 deletions
|
@ -106,10 +106,10 @@ void VM_Version::initialize() {
|
||||||
if (FLAG_IS_DEFAULT(OptoLoopAlignment)) {
|
if (FLAG_IS_DEFAULT(OptoLoopAlignment)) {
|
||||||
FLAG_SET_DEFAULT(OptoLoopAlignment, 4);
|
FLAG_SET_DEFAULT(OptoLoopAlignment, 4);
|
||||||
}
|
}
|
||||||
// When using CMS, we cannot use memset() in BOT updates because
|
// When using CMS or G1, we cannot use memset() in BOT updates
|
||||||
// the sun4v/CMT version in libc_psr uses BIS which exposes
|
// because the sun4v/CMT version in libc_psr uses BIS which
|
||||||
// "phantom zeros" to concurrent readers. See 6948537.
|
// exposes "phantom zeros" to concurrent readers. See 6948537.
|
||||||
if (FLAG_IS_DEFAULT(UseMemSetInBOT) && UseConcMarkSweepGC) {
|
if (FLAG_IS_DEFAULT(UseMemSetInBOT) && (UseConcMarkSweepGC || UseG1GC)) {
|
||||||
FLAG_SET_DEFAULT(UseMemSetInBOT, false);
|
FLAG_SET_DEFAULT(UseMemSetInBOT, false);
|
||||||
}
|
}
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -159,14 +159,30 @@ private:
|
||||||
"right address out of range");
|
"right address out of range");
|
||||||
assert(left < right, "Heap addresses out of order");
|
assert(left < right, "Heap addresses out of order");
|
||||||
size_t num_cards = pointer_delta(right, left) >> LogN_words;
|
size_t num_cards = pointer_delta(right, left) >> LogN_words;
|
||||||
|
if (UseMemSetInBOT) {
|
||||||
memset(&_offset_array[index_for(left)], offset, num_cards);
|
memset(&_offset_array[index_for(left)], offset, num_cards);
|
||||||
|
} else {
|
||||||
|
size_t i = index_for(left);
|
||||||
|
const size_t end = i + num_cards;
|
||||||
|
for (; i < end; i++) {
|
||||||
|
_offset_array[i] = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_offset_array(size_t left, size_t right, u_char offset) {
|
void set_offset_array(size_t left, size_t right, u_char offset) {
|
||||||
assert(right < _vs.committed_size(), "right address out of range");
|
assert(right < _vs.committed_size(), "right address out of range");
|
||||||
assert(left <= right, "indexes out of order");
|
assert(left <= right, "indexes out of order");
|
||||||
size_t num_cards = right - left + 1;
|
size_t num_cards = right - left + 1;
|
||||||
|
if (UseMemSetInBOT) {
|
||||||
memset(&_offset_array[left], offset, num_cards);
|
memset(&_offset_array[left], offset, num_cards);
|
||||||
|
} else {
|
||||||
|
size_t i = left;
|
||||||
|
const size_t end = i + num_cards;
|
||||||
|
for (; i < end; i++) {
|
||||||
|
_offset_array[i] = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const {
|
void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const {
|
||||||
|
|
|
@ -1934,6 +1934,14 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
|
||||||
clear_cset_start_regions();
|
clear_cset_start_regions();
|
||||||
|
|
||||||
guarantee(_task_queues != NULL, "task_queues allocation failure.");
|
guarantee(_task_queues != NULL, "task_queues allocation failure.");
|
||||||
|
#ifdef SPARC
|
||||||
|
// Issue a stern warning, but allow use for experimentation and debugging.
|
||||||
|
if (VM_Version::is_sun4v() && UseMemSetInBOT) {
|
||||||
|
assert(!FLAG_IS_DEFAULT(UseMemSetInBOT), "Error");
|
||||||
|
warning("Experimental flag -XX:+UseMemSetInBOT is known to cause instability"
|
||||||
|
" on sun4v; please understand that you are using at your own risk!");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
jint G1CollectedHeap::initialize() {
|
jint G1CollectedHeap::initialize() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue