提交 195509ea 编写于 作者: J johnc

6755988: G1: assert(new_obj != 0 || ... "should be forwarded")

Summary: A TLAB became large enough to be considered a humongous object allowing multiple objects to be allocated in a humongous region, which violates a basic assumption about humongous regions. The changes ensure that TLABs cannot be regarded as humongous.
Reviewed-by: iveresov, tonyp
上级 08d5451f
...@@ -2102,18 +2102,21 @@ size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const { ...@@ -2102,18 +2102,21 @@ size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const { size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
// Return the remaining space in the cur alloc region, but not less than // Return the remaining space in the cur alloc region, but not less than
// the min TLAB size. // the min TLAB size.
// Also, no more than half the region size, since we can't allow tlabs to
// grow big enough to accomodate humongous objects.
// We need to story it locally, since it might change between when we // Also, this value can be at most the humongous object threshold,
// test for NULL and when we use it later. // since we can't allow tlabs to grow big enough to accomodate
// humongous objects.
// We need to store the cur alloc region locally, since it might change
// between when we test for NULL and when we use it later.
ContiguousSpace* cur_alloc_space = _cur_alloc_region; ContiguousSpace* cur_alloc_space = _cur_alloc_region;
size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
if (cur_alloc_space == NULL) { if (cur_alloc_space == NULL) {
return HeapRegion::GrainBytes/2; return max_tlab_size;
} else { } else {
return MAX2(MIN2(cur_alloc_space->free(), return MIN2(MAX2(cur_alloc_space->free(), (size_t)MinTLABSize),
(size_t)(HeapRegion::GrainBytes/2)), max_tlab_size);
(size_t)MinTLABSize);
} }
} }
......
...@@ -1055,7 +1055,12 @@ public: ...@@ -1055,7 +1055,12 @@ public:
// Returns "true" iff the given word_size is "very large". // Returns "true" iff the given word_size is "very large".
static bool isHumongous(size_t word_size) { static bool isHumongous(size_t word_size) {
return word_size >= _humongous_object_threshold_in_words; // Note this has to be strictly greater-than as the TLABs
// are capped at the humongous thresold and we want to
// ensure that we don't try to allocate a TLAB as
// humongous and that we don't allocate a humongous
// object in a TLAB.
return word_size > _humongous_object_threshold_in_words;
} }
// Update mod union table with the set of dirty cards. // Update mod union table with the set of dirty cards.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册