< prev index next >
src/share/vm/gc_implementation/shared/plab.cpp
Print this page
rev 8154 : plab_fixed_again
@@ -22,10 +22,11 @@
*
*/
#include "precompiled.hpp"
#include "gc_implementation/shared/plab.hpp"
+#include "gc_interface/collectedHeap.hpp"
#include "memory/threadLocalAllocBuffer.hpp"
#include "oops/arrayOop.hpp"
#include "oops/oop.inline.hpp"
size_t PLAB::min_size() {
@@ -84,10 +85,32 @@
result += invalidate();
}
return result;
}
+void PLAB::add_undo_waste(HeapWord* obj, size_t word_sz) {
+ CollectedHeap::fill_with_object(obj, word_sz);
+ _undo_wasted += word_sz;
+}
+
+void PLAB::undo_last_allocation(HeapWord* obj, size_t word_sz) {
+ assert(pointer_delta(_top, _bottom) >= word_sz, "Bad undo");
+ assert(pointer_delta(_top, obj) == word_sz, "Bad undo");
+ _top = obj;
+}
+
+void PLAB::undo_allocation(HeapWord* obj, size_t word_sz) {
+ // Is the alloc in the current alloc buffer?
+ if (contains(obj)) {
+ assert(contains(obj + word_sz - 1),
+ "should contain whole object");
+ undo_last_allocation(obj, word_sz);
+ } else {
+ add_undo_waste(obj, word_sz);
+ }
+}
+
// Compute desired plab size and latch result for later
// use. This should be called once at the end of parallel
// scavenge; it clears the sensor accumulators.
void PLABStats::adjust_desired_plab_sz(uint no_of_gc_workers) {
assert(ResizePLAB, "Not set");
@@ -98,11 +121,11 @@
if (_allocated == 0) {
assert(_unused == 0,
err_msg("Inconsistency in PLAB stats: "
"_allocated: "SIZE_FORMAT", "
"_wasted: "SIZE_FORMAT", "
- "_unused: "SIZE_FORMAT", ",
+ "_unused: "SIZE_FORMAT", "
"_undo_wasted: "SIZE_FORMAT,
_allocated, _wasted, _unused, _undo_wasted));
_allocated = 1;
}
< prev index next >