提交 5f5281de 编写于 作者: T tschatzl

8034948: Back out JDK-6976350 since it does not fix any issue

Summary: Revert JDK-6976350 because it does not improve PLAB fragmentation. To the contrary, it tends to increase the amount of wasted space with many threads.
Reviewed-by: brutisso
上级 8f0291b1
...@@ -606,6 +606,11 @@ protected: ...@@ -606,6 +606,11 @@ protected:
// may not be a humongous - it must fit into a single heap region. // may not be a humongous - it must fit into a single heap region.
HeapWord* par_allocate_during_gc(GCAllocPurpose purpose, size_t word_size); HeapWord* par_allocate_during_gc(GCAllocPurpose purpose, size_t word_size);
HeapWord* allocate_during_gc_slow(GCAllocPurpose purpose,
HeapRegion* alloc_region,
bool par,
size_t word_size);
// Ensure that no further allocations can happen in "r", bearing in mind // Ensure that no further allocations can happen in "r", bearing in mind
// that parallel threads might be attempting allocations. // that parallel threads might be attempting allocations.
void par_allocate_remaining_space(HeapRegion* r); void par_allocate_remaining_space(HeapRegion* r);
...@@ -1783,95 +1788,6 @@ public: ...@@ -1783,95 +1788,6 @@ public:
ParGCAllocBuffer::retire(end_of_gc, retain); ParGCAllocBuffer::retire(end_of_gc, retain);
_retired = true; _retired = true;
} }
bool is_retired() {
return _retired;
}
};
class G1ParGCAllocBufferContainer {
protected:
static int const _priority_max = 2;
G1ParGCAllocBuffer* _priority_buffer[_priority_max];
public:
G1ParGCAllocBufferContainer(size_t gclab_word_size) {
for (int pr = 0; pr < _priority_max; ++pr) {
_priority_buffer[pr] = new G1ParGCAllocBuffer(gclab_word_size);
}
}
~G1ParGCAllocBufferContainer() {
for (int pr = 0; pr < _priority_max; ++pr) {
assert(_priority_buffer[pr]->is_retired(), "alloc buffers should all retire at this point.");
delete _priority_buffer[pr];
}
}
HeapWord* allocate(size_t word_sz) {
HeapWord* obj;
for (int pr = 0; pr < _priority_max; ++pr) {
obj = _priority_buffer[pr]->allocate(word_sz);
if (obj != NULL) return obj;
}
return obj;
}
bool contains(void* addr) {
for (int pr = 0; pr < _priority_max; ++pr) {
if (_priority_buffer[pr]->contains(addr)) return true;
}
return false;
}
void undo_allocation(HeapWord* obj, size_t word_sz) {
bool finish_undo;
for (int pr = 0; pr < _priority_max; ++pr) {
if (_priority_buffer[pr]->contains(obj)) {
_priority_buffer[pr]->undo_allocation(obj, word_sz);
finish_undo = true;
}
}
if (!finish_undo) ShouldNotReachHere();
}
size_t words_remaining() {
size_t result = 0;
for (int pr = 0; pr < _priority_max; ++pr) {
result += _priority_buffer[pr]->words_remaining();
}
return result;
}
size_t words_remaining_in_retired_buffer() {
G1ParGCAllocBuffer* retired = _priority_buffer[0];
return retired->words_remaining();
}
void flush_stats_and_retire(PLABStats* stats, bool end_of_gc, bool retain) {
for (int pr = 0; pr < _priority_max; ++pr) {
_priority_buffer[pr]->flush_stats_and_retire(stats, end_of_gc, retain);
}
}
void update(bool end_of_gc, bool retain, HeapWord* buf, size_t word_sz) {
G1ParGCAllocBuffer* retired_and_set = _priority_buffer[0];
retired_and_set->retire(end_of_gc, retain);
retired_and_set->set_buf(buf);
retired_and_set->set_word_size(word_sz);
adjust_priority_order();
}
private:
void adjust_priority_order() {
G1ParGCAllocBuffer* retired_and_set = _priority_buffer[0];
int last = _priority_max - 1;
for (int pr = 0; pr < last; ++pr) {
_priority_buffer[pr] = _priority_buffer[pr + 1];
}
_priority_buffer[last] = retired_and_set;
}
}; };
class G1ParScanThreadState : public StackObj { class G1ParScanThreadState : public StackObj {
...@@ -1882,9 +1798,9 @@ protected: ...@@ -1882,9 +1798,9 @@ protected:
G1SATBCardTableModRefBS* _ct_bs; G1SATBCardTableModRefBS* _ct_bs;
G1RemSet* _g1_rem; G1RemSet* _g1_rem;
G1ParGCAllocBufferContainer _surviving_alloc_buffer; G1ParGCAllocBuffer _surviving_alloc_buffer;
G1ParGCAllocBufferContainer _tenured_alloc_buffer; G1ParGCAllocBuffer _tenured_alloc_buffer;
G1ParGCAllocBufferContainer* _alloc_buffers[GCAllocPurposeCount]; G1ParGCAllocBuffer* _alloc_buffers[GCAllocPurposeCount];
ageTable _age_table; ageTable _age_table;
G1ParScanClosure _scanner; G1ParScanClosure _scanner;
...@@ -1950,7 +1866,7 @@ public: ...@@ -1950,7 +1866,7 @@ public:
RefToScanQueue* refs() { return _refs; } RefToScanQueue* refs() { return _refs; }
ageTable* age_table() { return &_age_table; } ageTable* age_table() { return &_age_table; }
G1ParGCAllocBufferContainer* alloc_buffer(GCAllocPurpose purpose) { G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) {
return _alloc_buffers[purpose]; return _alloc_buffers[purpose];
} }
...@@ -1980,13 +1896,15 @@ public: ...@@ -1980,13 +1896,15 @@ public:
HeapWord* obj = NULL; HeapWord* obj = NULL;
size_t gclab_word_size = _g1h->desired_plab_sz(purpose); size_t gclab_word_size = _g1h->desired_plab_sz(purpose);
if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) {
G1ParGCAllocBufferContainer* alloc_buf = alloc_buffer(purpose); G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose);
add_to_alloc_buffer_waste(alloc_buf->words_remaining());
alloc_buf->retire(false /* end_of_gc */, false /* retain */);
HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size); HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size);
if (buf == NULL) return NULL; // Let caller handle allocation failure. if (buf == NULL) return NULL; // Let caller handle allocation failure.
// Otherwise.
add_to_alloc_buffer_waste(alloc_buf->words_remaining_in_retired_buffer()); alloc_buf->set_word_size(gclab_word_size);
alloc_buf->update(false /* end_of_gc */, false /* retain */, buf, gclab_word_size); alloc_buf->set_buf(buf);
obj = alloc_buf->allocate(word_sz); obj = alloc_buf->allocate(word_sz);
assert(obj != NULL, "buffer was definitely big enough..."); assert(obj != NULL, "buffer was definitely big enough...");
...@@ -2100,6 +2018,7 @@ public: ...@@ -2100,6 +2018,7 @@ public:
} }
} }
public:
void trim_queue(); void trim_queue();
}; };
......
...@@ -158,7 +158,7 @@ public: ...@@ -158,7 +158,7 @@ public:
// Fills in the unallocated portion of the buffer with a garbage object. // Fills in the unallocated portion of the buffer with a garbage object.
// If "end_of_gc" is TRUE, is after the last use in the GC. IF "retain" // If "end_of_gc" is TRUE, is after the last use in the GC. IF "retain"
// is true, attempt to re-use the unused portion in the next GC. // is true, attempt to re-use the unused portion in the next GC.
virtual void retire(bool end_of_gc, bool retain); void retire(bool end_of_gc, bool retain);
void print() PRODUCT_RETURN; void print() PRODUCT_RETURN;
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册