--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Jan 23 14:47:23 2014 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Mon Jan 27 13:14:53 2014 +0100
@@ -2996,7 +2996,17 @@
}
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
- return HeapRegion::GrainBytes;
+ return (_g1_policy->young_list_target_length() - young_list()->survivor_length()) * HeapRegion::GrainBytes;
+}
+
+size_t G1CollectedHeap::tlab_used(Thread* ignored) const {
+ return young_list()->eden_used_bytes();
+}
+
+// For G1 TLABs should not contain humongous objects, so the maximum TLAB size
+// must be smaller than the humongous object limit.
+size_t G1CollectedHeap::max_tlab_size() const {
+ return align_size_down(_humongous_object_threshold_in_words - 1, MinObjAlignment);
}
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
@@ -3008,11 +3018,11 @@
// humongous objects.
HeapRegion* hr = _mutator_alloc_region.get();
- size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
+ size_t max_tlab = max_tlab_size() * wordSize;
if (hr == NULL) {
- return max_tlab_size;
+ return max_tlab;
} else {
- return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab_size);
+ return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab);
}
}
@@ -3649,6 +3659,7 @@
// always_do_update_barrier = false;
assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
// Fill TLAB's and such
+ accumulate_statistics_all_tlabs();
ensure_parsability(true);
if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) &&
@@ -3673,6 +3684,8 @@
"derived pointer present"));
// always_do_update_barrier = true;
+ resize_all_tlabs();
+
// We have just completed a GC. Update the soft reference
// policy with the new heap occupancy
Universe::update_heap_info_at_gc();