mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 19:44:41 +02:00
8006088: Incompatible heap size flags accepted by VM
Make processing of minimum, initial and maximum heap size more intiutive by removing previous limitations on allowed values, and make error reporting consistent. Further, fix errors in ergonomic heap sizing. Reviewed-by: johnc, jwilhelm, tamao
This commit is contained in:
parent
0c4933f5b0
commit
9b9b515fb8
5 changed files with 67 additions and 35 deletions
|
@ -55,6 +55,10 @@ void CollectorPolicy::initialize_flags() {
|
|||
err_msg("max_alignment: " SIZE_FORMAT " not aligned by min_alignment: " SIZE_FORMAT,
|
||||
max_alignment(), min_alignment()));
|
||||
|
||||
if (MaxHeapSize < InitialHeapSize) {
|
||||
vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
|
||||
}
|
||||
|
||||
if (MetaspaceSize > MaxMetaspaceSize) {
|
||||
MaxMetaspaceSize = MetaspaceSize;
|
||||
}
|
||||
|
@ -78,21 +82,9 @@ void CollectorPolicy::initialize_flags() {
|
|||
}
|
||||
|
||||
void CollectorPolicy::initialize_size_info() {
|
||||
// User inputs from -mx and ms are aligned
|
||||
set_initial_heap_byte_size(InitialHeapSize);
|
||||
if (initial_heap_byte_size() == 0) {
|
||||
set_initial_heap_byte_size(NewSize + OldSize);
|
||||
}
|
||||
set_initial_heap_byte_size(align_size_up(_initial_heap_byte_size,
|
||||
min_alignment()));
|
||||
|
||||
set_min_heap_byte_size(Arguments::min_heap_size());
|
||||
if (min_heap_byte_size() == 0) {
|
||||
set_min_heap_byte_size(NewSize + OldSize);
|
||||
}
|
||||
set_min_heap_byte_size(align_size_up(_min_heap_byte_size,
|
||||
min_alignment()));
|
||||
|
||||
// User inputs from -mx and ms must be aligned
|
||||
set_min_heap_byte_size(align_size_up(Arguments::min_heap_size(), min_alignment()));
|
||||
set_initial_heap_byte_size(align_size_up(InitialHeapSize, min_alignment()));
|
||||
set_max_heap_byte_size(align_size_up(MaxHeapSize, max_alignment()));
|
||||
|
||||
// Check heap parameter properties
|
||||
|
@ -237,9 +229,6 @@ void TwoGenerationCollectorPolicy::initialize_flags() {
|
|||
GenCollectorPolicy::initialize_flags();
|
||||
|
||||
OldSize = align_size_down(OldSize, min_alignment());
|
||||
if (NewSize + OldSize > MaxHeapSize) {
|
||||
MaxHeapSize = NewSize + OldSize;
|
||||
}
|
||||
|
||||
if (FLAG_IS_CMDLINE(OldSize) && FLAG_IS_DEFAULT(NewSize)) {
|
||||
// NewRatio will be used later to set the young generation size so we use
|
||||
|
@ -254,6 +243,27 @@ void TwoGenerationCollectorPolicy::initialize_flags() {
|
|||
}
|
||||
MaxHeapSize = align_size_up(MaxHeapSize, max_alignment());
|
||||
|
||||
// adjust max heap size if necessary
|
||||
if (NewSize + OldSize > MaxHeapSize) {
|
||||
if (FLAG_IS_CMDLINE(MaxHeapSize)) {
|
||||
// somebody set a maximum heap size with the intention that we should not
|
||||
// exceed it. Adjust New/OldSize as necessary.
|
||||
uintx calculated_size = NewSize + OldSize;
|
||||
double shrink_factor = (double) MaxHeapSize / calculated_size;
|
||||
// align
|
||||
NewSize = align_size_down((uintx) (NewSize * shrink_factor), min_alignment());
|
||||
// OldSize is already aligned because above we aligned MaxHeapSize to
|
||||
// max_alignment(), and we just made sure that NewSize is aligned to
|
||||
// min_alignment(). In initialize_flags() we verified that max_alignment()
|
||||
// is a multiple of min_alignment().
|
||||
OldSize = MaxHeapSize - NewSize;
|
||||
} else {
|
||||
MaxHeapSize = NewSize + OldSize;
|
||||
}
|
||||
}
|
||||
// need to do this again
|
||||
MaxHeapSize = align_size_up(MaxHeapSize, max_alignment());
|
||||
|
||||
always_do_update_barrier = UseConcMarkSweepGC;
|
||||
|
||||
// Check validity of heap flags
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue