--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Mon May 06 13:03:46 2013 +0200
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Mon May 06 17:19:42 2013 +0200
@@ -55,6 +55,10 @@
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_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 @@
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 @@
}
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