diff --git a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index 9eedf804adcdaf22c7621a7bf3825bc004b97eb8..1a9a02896cb4fe766e9fe2f7d2e26ef19d39a352 100644 --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -1851,9 +1851,7 @@ public: if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose); add_to_alloc_buffer_waste(alloc_buf->words_remaining()); - alloc_buf->flush_stats_and_retire(_g1h->stats_for_purpose(purpose), - false /* end_of_gc */, - false /* retain */); + alloc_buf->retire(false /* end_of_gc */, false /* retain */); HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size); if (buf == NULL) return NULL; // Let caller handle allocation failure. diff --git a/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp b/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp index b768df9707c16f8c76f8bfaeaf7edc41e0887444..d159dbe28fc3eeca66133df4cac850c09e061521 100644 --- a/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp +++ b/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp @@ -90,7 +90,14 @@ void ParGCAllocBuffer::flush_stats(PLABStats* stats) { void PLABStats::adjust_desired_plab_sz() { assert(ResizePLAB, "Not set"); if (_allocated == 0) { - assert(_unused == 0, "Inconsistency in PLAB stats"); + assert(_unused == 0, + err_msg("Inconsistency in PLAB stats: " + "_allocated: "SIZE_FORMAT", " + "_wasted: "SIZE_FORMAT", " + "_unused: "SIZE_FORMAT", " + "_used : "SIZE_FORMAT, + _allocated, _wasted, _unused, _used)); + _allocated = 1; } double wasted_frac = (double)_unused/(double)_allocated; diff --git a/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp b/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp index fcb4c786f79b281eb4f1597dadb8f5927292b539..cb35ee28f2ec07ab7e11762bc7e608b0e3f4c979 100644 --- a/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp +++ b/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp @@ -52,6 +52,10 @@ protected: static size_t FillerHeaderSize; static size_t AlignmentReserve; + // Flush the stats supporting ergonomic sizing of PLAB's + // Should not be called directly + void flush_stats(PLABStats* stats); + public: // Initializes the buffer to be empty, but with the given "word_sz". // Must get initialized with "set_buf" for an allocation to succeed. @@ -120,12 +124,22 @@ public: } // Flush the stats supporting ergonomic sizing of PLAB's - void flush_stats(PLABStats* stats); + // and retire the current buffer. void flush_stats_and_retire(PLABStats* stats, bool end_of_gc, bool retain) { // We flush the stats first in order to get a reading of // unused space in the last buffer. if (ResizePLAB) { flush_stats(stats); + + // Since we have flushed the stats we need to clear + // the _allocated and _wasted fields. Not doing so + // will artifically inflate the values in the stats + // to which we add them. + // The next time we flush these values, we will add + // what we have just flushed in addition to the size + // of the buffers allocated between now and then. + _allocated = 0; + _wasted = 0; } // Retire the last allocation buffer. retire(end_of_gc, retain);