mirror of
https://github.com/openjdk/jdk.git
synced 2026-07-18 15:09:37 +00:00
8232102: Shenandoah: print everything in proper units
Reviewed-by: rkennke
This commit is contained in:
parent
5a120f0967
commit
57fcedc33d
@ -66,9 +66,12 @@ void ShenandoahAdaptiveHeuristics::choose_collection_set_from_regiondata(Shenand
|
||||
size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0;
|
||||
size_t max_cset = (size_t)((1.0 * capacity / 100 * ShenandoahEvacReserve) / ShenandoahEvacWaste);
|
||||
|
||||
log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "M, Actual Free: "
|
||||
SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M, Min Garbage: " SIZE_FORMAT "M",
|
||||
free_target / M, actual_free / M, max_cset / M, min_garbage / M);
|
||||
log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "%s, Actual Free: "
|
||||
SIZE_FORMAT "%s, Max CSet: " SIZE_FORMAT "%s, Min Garbage: " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(free_target), proper_unit_for_byte_size(free_target),
|
||||
byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free),
|
||||
byte_size_in_proper_unit(max_cset), proper_unit_for_byte_size(max_cset),
|
||||
byte_size_in_proper_unit(min_garbage), proper_unit_for_byte_size(min_garbage));
|
||||
|
||||
// Better select garbage-first regions
|
||||
QuickSort::sort<RegionData>(data, (int)size, compare_by_garbage, false);
|
||||
@ -119,8 +122,9 @@ bool ShenandoahAdaptiveHeuristics::should_start_gc() const {
|
||||
// anything else.
|
||||
size_t min_threshold = capacity / 100 * ShenandoahMinFreeThreshold;
|
||||
if (available < min_threshold) {
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
|
||||
available / M, min_threshold / M);
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "%s) is below minimum threshold (" SIZE_FORMAT "%s)",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(min_threshold), proper_unit_for_byte_size(min_threshold));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -129,8 +133,10 @@ bool ShenandoahAdaptiveHeuristics::should_start_gc() const {
|
||||
if (_gc_times_learned < max_learn) {
|
||||
size_t init_threshold = capacity / 100 * ShenandoahInitFreeThreshold;
|
||||
if (available < init_threshold) {
|
||||
log_info(gc)("Trigger: Learning " SIZE_FORMAT " of " SIZE_FORMAT ". Free (" SIZE_FORMAT "M) is below initial threshold (" SIZE_FORMAT "M)",
|
||||
_gc_times_learned + 1, max_learn, available / M, init_threshold / M);
|
||||
log_info(gc)("Trigger: Learning " SIZE_FORMAT " of " SIZE_FORMAT ". Free (" SIZE_FORMAT "%s) is below initial threshold (" SIZE_FORMAT "%s)",
|
||||
_gc_times_learned + 1, max_learn,
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(init_threshold), proper_unit_for_byte_size(init_threshold));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -154,10 +160,15 @@ bool ShenandoahAdaptiveHeuristics::should_start_gc() const {
|
||||
double allocation_rate = heap->bytes_allocated_since_gc_start() / time_since_last;
|
||||
|
||||
if (average_gc > allocation_headroom / allocation_rate) {
|
||||
log_info(gc)("Trigger: Average GC time (%.2f ms) is above the time for allocation rate (%.2f MB/s) to deplete free headroom (" SIZE_FORMAT "M)",
|
||||
average_gc * 1000, allocation_rate / M, allocation_headroom / M);
|
||||
log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "M (free) - " SIZE_FORMAT "M (spike) - " SIZE_FORMAT "M (penalties) = " SIZE_FORMAT "M",
|
||||
available / M, spike_headroom / M, penalties / M, allocation_headroom / M);
|
||||
log_info(gc)("Trigger: Average GC time (%.2f ms) is above the time for allocation rate (%.0f %sB/s) to deplete free headroom (" SIZE_FORMAT "%s)",
|
||||
average_gc * 1000,
|
||||
byte_size_in_proper_unit(allocation_rate), proper_unit_for_byte_size(allocation_rate),
|
||||
byte_size_in_proper_unit(allocation_headroom), proper_unit_for_byte_size(allocation_headroom));
|
||||
log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "%s (free) - " SIZE_FORMAT "%s (spike) - " SIZE_FORMAT "%s (penalties) = " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(spike_headroom), proper_unit_for_byte_size(spike_headroom),
|
||||
byte_size_in_proper_unit(penalties), proper_unit_for_byte_size(penalties),
|
||||
byte_size_in_proper_unit(allocation_headroom), proper_unit_for_byte_size(allocation_headroom));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -59,21 +59,24 @@ bool ShenandoahCompactHeuristics::should_start_gc() const {
|
||||
size_t min_threshold = capacity / 100 * ShenandoahMinFreeThreshold;
|
||||
|
||||
if (available < min_threshold) {
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
|
||||
available / M, min_threshold / M);
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "%s) is below minimum threshold (" SIZE_FORMAT "%s)",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(min_threshold), proper_unit_for_byte_size(min_threshold));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (available < threshold_bytes_allocated) {
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is lower than allocated recently (" SIZE_FORMAT "M)",
|
||||
available / M, threshold_bytes_allocated / M);
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "%s) is lower than allocated recently (" SIZE_FORMAT "%s)",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(threshold_bytes_allocated), proper_unit_for_byte_size(threshold_bytes_allocated));
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t bytes_allocated = heap->bytes_allocated_since_gc_start();
|
||||
if (bytes_allocated > threshold_bytes_allocated) {
|
||||
log_info(gc)("Trigger: Allocated since last cycle (" SIZE_FORMAT "M) is larger than allocation threshold (" SIZE_FORMAT "M)",
|
||||
bytes_allocated / M, threshold_bytes_allocated / M);
|
||||
log_info(gc)("Trigger: Allocated since last cycle (" SIZE_FORMAT "%s) is larger than allocation threshold (" SIZE_FORMAT "%s)",
|
||||
byte_size_in_proper_unit(bytes_allocated), proper_unit_for_byte_size(bytes_allocated),
|
||||
byte_size_in_proper_unit(threshold_bytes_allocated), proper_unit_for_byte_size(threshold_bytes_allocated));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -86,8 +89,9 @@ void ShenandoahCompactHeuristics::choose_collection_set_from_regiondata(Shenando
|
||||
// Do not select too large CSet that would overflow the available free space
|
||||
size_t max_cset = actual_free * 3 / 4;
|
||||
|
||||
log_info(gc, ergo)("CSet Selection. Actual Free: " SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M",
|
||||
actual_free / M, max_cset / M);
|
||||
log_info(gc, ergo)("CSet Selection. Actual Free: " SIZE_FORMAT "%s, Max CSet: " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free),
|
||||
byte_size_in_proper_unit(max_cset), proper_unit_for_byte_size(max_cset));
|
||||
|
||||
size_t threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
|
||||
|
||||
|
||||
@ -60,8 +60,9 @@ void ShenandoahPassiveHeuristics::choose_collection_set_from_regiondata(Shenando
|
||||
size_t available = MAX2(capacity / 100 * ShenandoahEvacReserve, actual_free);
|
||||
size_t max_cset = (size_t)(available / ShenandoahEvacWaste);
|
||||
|
||||
log_info(gc, ergo)("CSet Selection. Actual Free: " SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M",
|
||||
actual_free / M, max_cset / M);
|
||||
log_info(gc, ergo)("CSet Selection. Actual Free: " SIZE_FORMAT "%s, Max CSet: " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free),
|
||||
byte_size_in_proper_unit(max_cset), proper_unit_for_byte_size(max_cset));
|
||||
|
||||
size_t threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
|
||||
|
||||
|
||||
@ -57,8 +57,9 @@ bool ShenandoahStaticHeuristics::should_start_gc() const {
|
||||
size_t threshold_available = capacity / 100 * ShenandoahFreeThreshold;
|
||||
|
||||
if (available < threshold_available) {
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below free threshold (" SIZE_FORMAT "M)",
|
||||
available / M, threshold_available / M);
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "%s) is below free threshold (" SIZE_FORMAT "%s)",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(threshold_available), proper_unit_for_byte_size(threshold_available));
|
||||
return true;
|
||||
}
|
||||
return ShenandoahHeuristics::should_start_gc();
|
||||
|
||||
@ -100,9 +100,12 @@ void ShenandoahTraversalHeuristics::choose_collection_set(ShenandoahCollectionSe
|
||||
size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0;
|
||||
size_t max_cset = (size_t)((1.0 * capacity / 100 * ShenandoahEvacReserve) / ShenandoahEvacWaste);
|
||||
|
||||
log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "M, Actual Free: "
|
||||
SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M, Min Garbage: " SIZE_FORMAT "M",
|
||||
free_target / M, actual_free / M, max_cset / M, min_garbage / M);
|
||||
log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "%s, Actual Free: "
|
||||
SIZE_FORMAT "%s, Max CSet: " SIZE_FORMAT "%s, Min Garbage: " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(free_target), proper_unit_for_byte_size(free_target),
|
||||
byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free),
|
||||
byte_size_in_proper_unit(max_cset), proper_unit_for_byte_size(max_cset),
|
||||
byte_size_in_proper_unit(min_garbage), proper_unit_for_byte_size(min_garbage));
|
||||
|
||||
// Better select garbage-first regions, and then older ones
|
||||
QuickSort::sort<RegionData>(data, (int) cnt, compare_by_garbage_then_alloc_seq_ascending, false);
|
||||
@ -190,8 +193,9 @@ bool ShenandoahTraversalHeuristics::should_start_gc() const {
|
||||
// anything else.
|
||||
size_t min_threshold = capacity / 100 * ShenandoahMinFreeThreshold;
|
||||
if (available < min_threshold) {
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
|
||||
available / M, min_threshold / M);
|
||||
log_info(gc)("Trigger: Free (" SIZE_FORMAT "%s) is below minimum threshold (" SIZE_FORMAT "%s)",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(min_threshold), proper_unit_for_byte_size(min_threshold));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -200,8 +204,10 @@ bool ShenandoahTraversalHeuristics::should_start_gc() const {
|
||||
if (_gc_times_learned < max_learn) {
|
||||
size_t init_threshold = capacity / 100 * ShenandoahInitFreeThreshold;
|
||||
if (available < init_threshold) {
|
||||
log_info(gc)("Trigger: Learning " SIZE_FORMAT " of " SIZE_FORMAT ". Free (" SIZE_FORMAT "M) is below initial threshold (" SIZE_FORMAT "M)",
|
||||
_gc_times_learned + 1, max_learn, available / M, init_threshold / M);
|
||||
log_info(gc)("Trigger: Learning " SIZE_FORMAT " of " SIZE_FORMAT ". Free (" SIZE_FORMAT "%s) is below initial threshold (" SIZE_FORMAT "%s)",
|
||||
_gc_times_learned + 1, max_learn,
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(init_threshold), proper_unit_for_byte_size(init_threshold));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -223,10 +229,15 @@ bool ShenandoahTraversalHeuristics::should_start_gc() const {
|
||||
double allocation_rate = heap->bytes_allocated_since_gc_start() / time_since_last;
|
||||
|
||||
if (average_gc > allocation_headroom / allocation_rate) {
|
||||
log_info(gc)("Trigger: Average GC time (%.2f ms) is above the time for allocation rate (%.2f MB/s) to deplete free headroom (" SIZE_FORMAT "M)",
|
||||
average_gc * 1000, allocation_rate / M, allocation_headroom / M);
|
||||
log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "M (free) - " SIZE_FORMAT "M (spike) - " SIZE_FORMAT "M (penalties) = " SIZE_FORMAT "M",
|
||||
available / M, spike_headroom / M, penalties / M, allocation_headroom / M);
|
||||
log_info(gc)("Trigger: Average GC time (%.2f ms) is above the time for allocation rate (%.0f %sB/s) to deplete free headroom (" SIZE_FORMAT "%s)",
|
||||
average_gc * 1000,
|
||||
byte_size_in_proper_unit(allocation_rate), proper_unit_for_byte_size(allocation_rate),
|
||||
byte_size_in_proper_unit(allocation_headroom), proper_unit_for_byte_size(allocation_headroom));
|
||||
log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "%s (free) - " SIZE_FORMAT "%s (spike) - " SIZE_FORMAT "%s (penalties) = " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(available), proper_unit_for_byte_size(available),
|
||||
byte_size_in_proper_unit(spike_headroom), proper_unit_for_byte_size(spike_headroom),
|
||||
byte_size_in_proper_unit(penalties), proper_unit_for_byte_size(penalties),
|
||||
byte_size_in_proper_unit(allocation_headroom), proper_unit_for_byte_size(allocation_headroom));
|
||||
return true;
|
||||
} else if (ShenandoahHeuristics::should_start_gc()) {
|
||||
return true;
|
||||
|
||||
@ -491,8 +491,12 @@ void ShenandoahFreeSet::log_status() {
|
||||
size_t max_humongous = max_contig * ShenandoahHeapRegion::region_size_bytes();
|
||||
size_t free = capacity() - used();
|
||||
|
||||
ls.print("Free: " SIZE_FORMAT "M (" SIZE_FORMAT " regions), Max regular: " SIZE_FORMAT "K, Max humongous: " SIZE_FORMAT "K, ",
|
||||
total_free / M, mutator_count(), max / K, max_humongous / K);
|
||||
ls.print("Free: " SIZE_FORMAT "%s (" SIZE_FORMAT " regions), Max regular: " SIZE_FORMAT "%s, Max humongous: " SIZE_FORMAT "%s, ",
|
||||
byte_size_in_proper_unit(total_free), proper_unit_for_byte_size(total_free),
|
||||
mutator_count(),
|
||||
byte_size_in_proper_unit(max), proper_unit_for_byte_size(max),
|
||||
byte_size_in_proper_unit(max_humongous), proper_unit_for_byte_size(max_humongous)
|
||||
);
|
||||
|
||||
size_t frag_ext;
|
||||
if (free > 0) {
|
||||
@ -525,8 +529,10 @@ void ShenandoahFreeSet::log_status() {
|
||||
}
|
||||
}
|
||||
|
||||
ls.print_cr("Evacuation Reserve: " SIZE_FORMAT "M (" SIZE_FORMAT " regions), Max regular: " SIZE_FORMAT "K",
|
||||
total_free / M, collector_count(), max / K);
|
||||
ls.print_cr("Evacuation Reserve: " SIZE_FORMAT "%s (" SIZE_FORMAT " regions), Max regular: " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(total_free), proper_unit_for_byte_size(total_free),
|
||||
collector_count(),
|
||||
byte_size_in_proper_unit(max), proper_unit_for_byte_size(max));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -522,10 +522,14 @@ void ShenandoahHeap::reset_mark_bitmap() {
|
||||
|
||||
void ShenandoahHeap::print_on(outputStream* st) const {
|
||||
st->print_cr("Shenandoah Heap");
|
||||
st->print_cr(" " SIZE_FORMAT "K total, " SIZE_FORMAT "K committed, " SIZE_FORMAT "K used",
|
||||
max_capacity() / K, committed() / K, used() / K);
|
||||
st->print_cr(" " SIZE_FORMAT " x " SIZE_FORMAT"K regions",
|
||||
num_regions(), ShenandoahHeapRegion::region_size_bytes() / K);
|
||||
st->print_cr(" " SIZE_FORMAT "%s total, " SIZE_FORMAT "%s committed, " SIZE_FORMAT "%s used",
|
||||
byte_size_in_proper_unit(max_capacity()), proper_unit_for_byte_size(max_capacity()),
|
||||
byte_size_in_proper_unit(committed()), proper_unit_for_byte_size(committed()),
|
||||
byte_size_in_proper_unit(used()), proper_unit_for_byte_size(used()));
|
||||
st->print_cr(" " SIZE_FORMAT " x " SIZE_FORMAT"%s regions",
|
||||
num_regions(),
|
||||
byte_size_in_proper_unit(ShenandoahHeapRegion::region_size_bytes()),
|
||||
proper_unit_for_byte_size(ShenandoahHeapRegion::region_size_bytes()));
|
||||
|
||||
st->print("Status: ");
|
||||
if (has_forwarded_objects()) st->print("has forwarded objects, ");
|
||||
|
||||
@ -527,29 +527,35 @@ void ShenandoahHeapRegion::setup_sizes(size_t max_heap_size) {
|
||||
size_t region_size;
|
||||
if (FLAG_IS_DEFAULT(ShenandoahHeapRegionSize)) {
|
||||
if (ShenandoahMinRegionSize > max_heap_size / MIN_NUM_REGIONS) {
|
||||
err_msg message("Max heap size (" SIZE_FORMAT "K) is too low to afford the minimum number "
|
||||
"of regions (" SIZE_FORMAT ") of minimum region size (" SIZE_FORMAT "K).",
|
||||
max_heap_size/K, MIN_NUM_REGIONS, ShenandoahMinRegionSize/K);
|
||||
err_msg message("Max heap size (" SIZE_FORMAT "%s) is too low to afford the minimum number "
|
||||
"of regions (" SIZE_FORMAT ") of minimum region size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(max_heap_size), proper_unit_for_byte_size(max_heap_size),
|
||||
MIN_NUM_REGIONS,
|
||||
byte_size_in_proper_unit(ShenandoahMinRegionSize), proper_unit_for_byte_size(ShenandoahMinRegionSize));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize option", message);
|
||||
}
|
||||
if (ShenandoahMinRegionSize < MIN_REGION_SIZE) {
|
||||
err_msg message("" SIZE_FORMAT "K should not be lower than minimum region size (" SIZE_FORMAT "K).",
|
||||
ShenandoahMinRegionSize/K, MIN_REGION_SIZE/K);
|
||||
err_msg message("" SIZE_FORMAT "%s should not be lower than minimum region size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(ShenandoahMinRegionSize), proper_unit_for_byte_size(ShenandoahMinRegionSize),
|
||||
byte_size_in_proper_unit(MIN_REGION_SIZE), proper_unit_for_byte_size(MIN_REGION_SIZE));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize option", message);
|
||||
}
|
||||
if (ShenandoahMinRegionSize < MinTLABSize) {
|
||||
err_msg message("" SIZE_FORMAT "K should not be lower than TLAB size size (" SIZE_FORMAT "K).",
|
||||
ShenandoahMinRegionSize/K, MinTLABSize/K);
|
||||
err_msg message("" SIZE_FORMAT "%s should not be lower than TLAB size size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(ShenandoahMinRegionSize), proper_unit_for_byte_size(ShenandoahMinRegionSize),
|
||||
byte_size_in_proper_unit(MinTLABSize), proper_unit_for_byte_size(MinTLABSize));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize option", message);
|
||||
}
|
||||
if (ShenandoahMaxRegionSize < MIN_REGION_SIZE) {
|
||||
err_msg message("" SIZE_FORMAT "K should not be lower than min region size (" SIZE_FORMAT "K).",
|
||||
ShenandoahMaxRegionSize/K, MIN_REGION_SIZE/K);
|
||||
err_msg message("" SIZE_FORMAT "%s should not be lower than min region size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(ShenandoahMaxRegionSize), proper_unit_for_byte_size(ShenandoahMaxRegionSize),
|
||||
byte_size_in_proper_unit(MIN_REGION_SIZE), proper_unit_for_byte_size(MIN_REGION_SIZE));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahMaxRegionSize option", message);
|
||||
}
|
||||
if (ShenandoahMinRegionSize > ShenandoahMaxRegionSize) {
|
||||
err_msg message("Minimum (" SIZE_FORMAT "K) should be larger than maximum (" SIZE_FORMAT "K).",
|
||||
ShenandoahMinRegionSize/K, ShenandoahMaxRegionSize/K);
|
||||
err_msg message("Minimum (" SIZE_FORMAT "%s) should be larger than maximum (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(ShenandoahMinRegionSize), proper_unit_for_byte_size(ShenandoahMinRegionSize),
|
||||
byte_size_in_proper_unit(ShenandoahMaxRegionSize), proper_unit_for_byte_size(ShenandoahMaxRegionSize));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize or -XX:ShenandoahMaxRegionSize", message);
|
||||
}
|
||||
|
||||
@ -563,19 +569,23 @@ void ShenandoahHeapRegion::setup_sizes(size_t max_heap_size) {
|
||||
|
||||
} else {
|
||||
if (ShenandoahHeapRegionSize > max_heap_size / MIN_NUM_REGIONS) {
|
||||
err_msg message("Max heap size (" SIZE_FORMAT "K) is too low to afford the minimum number "
|
||||
"of regions (" SIZE_FORMAT ") of requested size (" SIZE_FORMAT "K).",
|
||||
max_heap_size/K, MIN_NUM_REGIONS, ShenandoahHeapRegionSize/K);
|
||||
err_msg message("Max heap size (" SIZE_FORMAT "%s) is too low to afford the minimum number "
|
||||
"of regions (" SIZE_FORMAT ") of requested size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(max_heap_size), proper_unit_for_byte_size(max_heap_size),
|
||||
MIN_NUM_REGIONS,
|
||||
byte_size_in_proper_unit(ShenandoahHeapRegionSize), proper_unit_for_byte_size(ShenandoahHeapRegionSize));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahHeapRegionSize option", message);
|
||||
}
|
||||
if (ShenandoahHeapRegionSize < ShenandoahMinRegionSize) {
|
||||
err_msg message("Heap region size (" SIZE_FORMAT "K) should be larger than min region size (" SIZE_FORMAT "K).",
|
||||
ShenandoahHeapRegionSize/K, ShenandoahMinRegionSize/K);
|
||||
err_msg message("Heap region size (" SIZE_FORMAT "%s) should be larger than min region size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(ShenandoahHeapRegionSize), proper_unit_for_byte_size(ShenandoahHeapRegionSize),
|
||||
byte_size_in_proper_unit(ShenandoahMinRegionSize), proper_unit_for_byte_size(ShenandoahMinRegionSize));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahHeapRegionSize option", message);
|
||||
}
|
||||
if (ShenandoahHeapRegionSize > ShenandoahMaxRegionSize) {
|
||||
err_msg message("Heap region size (" SIZE_FORMAT "K) should be lower than max region size (" SIZE_FORMAT "K).",
|
||||
ShenandoahHeapRegionSize/K, ShenandoahMaxRegionSize/K);
|
||||
err_msg message("Heap region size (" SIZE_FORMAT "%s) should be lower than max region size (" SIZE_FORMAT "%s).",
|
||||
byte_size_in_proper_unit(ShenandoahHeapRegionSize), proper_unit_for_byte_size(ShenandoahHeapRegionSize),
|
||||
byte_size_in_proper_unit(ShenandoahMaxRegionSize), proper_unit_for_byte_size(ShenandoahMaxRegionSize));
|
||||
vm_exit_during_initialization("Invalid -XX:ShenandoahHeapRegionSize option", message);
|
||||
}
|
||||
region_size = ShenandoahHeapRegionSize;
|
||||
|
||||
@ -186,8 +186,9 @@ void ShenandoahHeuristics::choose_collection_set(ShenandoahCollectionSet* collec
|
||||
// given the amount of immediately reclaimable garbage. If we do, figure out the collection set.
|
||||
|
||||
assert (immediate_garbage <= total_garbage,
|
||||
"Cannot have more immediate garbage than total garbage: " SIZE_FORMAT "M vs " SIZE_FORMAT "M",
|
||||
immediate_garbage / M, total_garbage / M);
|
||||
"Cannot have more immediate garbage than total garbage: " SIZE_FORMAT "%s vs " SIZE_FORMAT "%s",
|
||||
byte_size_in_proper_unit(immediate_garbage), proper_unit_for_byte_size(immediate_garbage),
|
||||
byte_size_in_proper_unit(total_garbage), proper_unit_for_byte_size(total_garbage));
|
||||
|
||||
size_t immediate_percent = total_garbage == 0 ? 0 : (immediate_garbage * 100 / total_garbage);
|
||||
|
||||
@ -196,12 +197,16 @@ void ShenandoahHeuristics::choose_collection_set(ShenandoahCollectionSet* collec
|
||||
collection_set->update_region_status();
|
||||
|
||||
size_t cset_percent = total_garbage == 0 ? 0 : (collection_set->garbage() * 100 / total_garbage);
|
||||
log_info(gc, ergo)("Collectable Garbage: " SIZE_FORMAT "M (" SIZE_FORMAT "%% of total), " SIZE_FORMAT "M CSet, " SIZE_FORMAT " CSet regions",
|
||||
collection_set->garbage() / M, cset_percent, collection_set->live_data() / M, collection_set->count());
|
||||
log_info(gc, ergo)("Collectable Garbage: " SIZE_FORMAT "%s (" SIZE_FORMAT "%% of total), " SIZE_FORMAT "%s CSet, " SIZE_FORMAT " CSet regions",
|
||||
byte_size_in_proper_unit(collection_set->garbage()), proper_unit_for_byte_size(collection_set->garbage()),
|
||||
cset_percent,
|
||||
byte_size_in_proper_unit(collection_set->live_data()), proper_unit_for_byte_size(collection_set->live_data()),
|
||||
collection_set->count());
|
||||
}
|
||||
|
||||
log_info(gc, ergo)("Immediate Garbage: " SIZE_FORMAT "M (" SIZE_FORMAT "%% of total), " SIZE_FORMAT " regions",
|
||||
immediate_garbage / M, immediate_percent, immediate_regions);
|
||||
log_info(gc, ergo)("Immediate Garbage: " SIZE_FORMAT "%s (" SIZE_FORMAT "%% of total), " SIZE_FORMAT " regions",
|
||||
byte_size_in_proper_unit(immediate_garbage), proper_unit_for_byte_size(immediate_garbage),
|
||||
immediate_percent, immediate_regions);
|
||||
}
|
||||
|
||||
void ShenandoahHeuristics::record_gc_start() {
|
||||
|
||||
@ -70,9 +70,12 @@ void ShenandoahPacer::setup_for_mark() {
|
||||
|
||||
restart_with(non_taxable, tax);
|
||||
|
||||
log_info(gc, ergo)("Pacer for Mark. Expected Live: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
|
||||
"M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
|
||||
live / M, free / M, non_taxable / M, tax);
|
||||
log_info(gc, ergo)("Pacer for Mark. Expected Live: " SIZE_FORMAT "%s, Free: " SIZE_FORMAT "%s, "
|
||||
"Non-Taxable: " SIZE_FORMAT "%s, Alloc Tax Rate: %.1fx",
|
||||
byte_size_in_proper_unit(live), proper_unit_for_byte_size(live),
|
||||
byte_size_in_proper_unit(free), proper_unit_for_byte_size(free),
|
||||
byte_size_in_proper_unit(non_taxable), proper_unit_for_byte_size(non_taxable),
|
||||
tax);
|
||||
}
|
||||
|
||||
void ShenandoahPacer::setup_for_evac() {
|
||||
@ -91,9 +94,12 @@ void ShenandoahPacer::setup_for_evac() {
|
||||
|
||||
restart_with(non_taxable, tax);
|
||||
|
||||
log_info(gc, ergo)("Pacer for Evacuation. Used CSet: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
|
||||
"M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
|
||||
used / M, free / M, non_taxable / M, tax);
|
||||
log_info(gc, ergo)("Pacer for Evacuation. Used CSet: " SIZE_FORMAT "%s, Free: " SIZE_FORMAT "%s, "
|
||||
"Non-Taxable: " SIZE_FORMAT "%s, Alloc Tax Rate: %.1fx",
|
||||
byte_size_in_proper_unit(used), proper_unit_for_byte_size(used),
|
||||
byte_size_in_proper_unit(free), proper_unit_for_byte_size(free),
|
||||
byte_size_in_proper_unit(non_taxable), proper_unit_for_byte_size(non_taxable),
|
||||
tax);
|
||||
}
|
||||
|
||||
void ShenandoahPacer::setup_for_updaterefs() {
|
||||
@ -112,9 +118,12 @@ void ShenandoahPacer::setup_for_updaterefs() {
|
||||
|
||||
restart_with(non_taxable, tax);
|
||||
|
||||
log_info(gc, ergo)("Pacer for Update Refs. Used: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
|
||||
"M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
|
||||
used / M, free / M, non_taxable / M, tax);
|
||||
log_info(gc, ergo)("Pacer for Update Refs. Used: " SIZE_FORMAT "%s, Free: " SIZE_FORMAT "%s, "
|
||||
"Non-Taxable: " SIZE_FORMAT "%s, Alloc Tax Rate: %.1fx",
|
||||
byte_size_in_proper_unit(used), proper_unit_for_byte_size(used),
|
||||
byte_size_in_proper_unit(free), proper_unit_for_byte_size(free),
|
||||
byte_size_in_proper_unit(non_taxable), proper_unit_for_byte_size(non_taxable),
|
||||
tax);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -136,9 +145,12 @@ void ShenandoahPacer::setup_for_traversal() {
|
||||
|
||||
restart_with(non_taxable, tax);
|
||||
|
||||
log_info(gc, ergo)("Pacer for Traversal. Expected Live: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
|
||||
"M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
|
||||
live / M, free / M, non_taxable / M, tax);
|
||||
log_info(gc, ergo)("Pacer for Traversal. Expected Live: " SIZE_FORMAT "%s, Free: " SIZE_FORMAT "%s, "
|
||||
"Non-Taxable: " SIZE_FORMAT "%s, Alloc Tax Rate: %.1fx",
|
||||
byte_size_in_proper_unit(live), proper_unit_for_byte_size(live),
|
||||
byte_size_in_proper_unit(free), proper_unit_for_byte_size(free),
|
||||
byte_size_in_proper_unit(non_taxable), proper_unit_for_byte_size(non_taxable),
|
||||
tax);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -158,8 +170,9 @@ void ShenandoahPacer::setup_for_idle() {
|
||||
|
||||
restart_with(initial, tax);
|
||||
|
||||
log_info(gc, ergo)("Pacer for Idle. Initial: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
|
||||
initial / M, tax);
|
||||
log_info(gc, ergo)("Pacer for Idle. Initial: " SIZE_FORMAT "%s, Alloc Tax Rate: %.1fx",
|
||||
byte_size_in_proper_unit(initial), proper_unit_for_byte_size(initial),
|
||||
tax);
|
||||
}
|
||||
|
||||
size_t ShenandoahPacer::update_and_get_progress_history() {
|
||||
|
||||
@ -205,8 +205,11 @@ void ShenandoahStrDedupQueue::release_buffers(ShenandoahQueueBuffer* list) {
|
||||
void ShenandoahStrDedupQueue::print_statistics_impl() {
|
||||
Log(gc, stringdedup) log;
|
||||
log.debug(" Queue:");
|
||||
log.debug(" Total buffers: " SIZE_FORMAT " (" SIZE_FORMAT " K). " SIZE_FORMAT " buffers are on free list",
|
||||
_total_buffers, (_total_buffers * sizeof(ShenandoahQueueBuffer) / K), _num_free_buffer);
|
||||
log.debug(" Total buffers: " SIZE_FORMAT " (" SIZE_FORMAT " %s). " SIZE_FORMAT " buffers are on free list",
|
||||
_total_buffers,
|
||||
byte_size_in_proper_unit(_total_buffers * sizeof(ShenandoahQueueBuffer)),
|
||||
proper_unit_for_byte_size(_total_buffers * sizeof(ShenandoahQueueBuffer)),
|
||||
_num_free_buffer);
|
||||
}
|
||||
|
||||
class VerifyQueueClosure : public OopClosure {
|
||||
|
||||
@ -366,8 +366,10 @@ void ShenandoahTraversalGC::prepare() {
|
||||
// Rebuild free set
|
||||
free_set->rebuild();
|
||||
|
||||
log_info(gc, ergo)("Collectable Garbage: " SIZE_FORMAT "M, " SIZE_FORMAT "M CSet, " SIZE_FORMAT " CSet regions",
|
||||
collection_set->garbage() / M, collection_set->live_data() / M, collection_set->count());
|
||||
log_info(gc, ergo)("Collectable Garbage: " SIZE_FORMAT "%s, " SIZE_FORMAT "%s CSet, " SIZE_FORMAT " CSet regions",
|
||||
byte_size_in_proper_unit(collection_set->garbage()), proper_unit_for_byte_size(collection_set->garbage()),
|
||||
byte_size_in_proper_unit(collection_set->live_data()), proper_unit_for_byte_size(collection_set->live_data()),
|
||||
collection_set->count());
|
||||
}
|
||||
|
||||
void ShenandoahTraversalGC::init_traversal_collection() {
|
||||
|
||||
@ -686,13 +686,17 @@ void ShenandoahVerifier::verify_at_safepoint(const char *label,
|
||||
_heap->heap_region_iterate(&cl);
|
||||
size_t heap_used = _heap->used();
|
||||
guarantee(cl.used() == heap_used,
|
||||
"%s: heap used size must be consistent: heap-used = " SIZE_FORMAT "K, regions-used = " SIZE_FORMAT "K",
|
||||
label, heap_used/K, cl.used()/K);
|
||||
"%s: heap used size must be consistent: heap-used = " SIZE_FORMAT "%s, regions-used = " SIZE_FORMAT "%s",
|
||||
label,
|
||||
byte_size_in_proper_unit(heap_used), proper_unit_for_byte_size(heap_used),
|
||||
byte_size_in_proper_unit(cl.used()), proper_unit_for_byte_size(cl.used()));
|
||||
|
||||
size_t heap_committed = _heap->committed();
|
||||
guarantee(cl.committed() == heap_committed,
|
||||
"%s: heap committed size must be consistent: heap-committed = " SIZE_FORMAT "K, regions-committed = " SIZE_FORMAT "K",
|
||||
label, heap_committed/K, cl.committed()/K);
|
||||
"%s: heap committed size must be consistent: heap-committed = " SIZE_FORMAT "%s, regions-committed = " SIZE_FORMAT "%s",
|
||||
label,
|
||||
byte_size_in_exact_unit(heap_committed), proper_unit_for_byte_size(heap_committed),
|
||||
byte_size_in_exact_unit(cl.committed()), proper_unit_for_byte_size(cl.committed()));
|
||||
}
|
||||
|
||||
// Internal heap region checks
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user