RFR (S): 8005989: The default value for MaxNewSize should be less than or equal to MaxHeapSize
Erik Helin
erik.helin at oracle.com
Sat Jan 12 00:27:56 PST 2013
Hi all,
this change sets MaxNewSize to always be less than or equal to
MaxHeapSize. The current default value is max_uintx.
Webrev:
http://cr.openjdk.java.net/~ehelin/8005989/webrev.00/
RFE:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8005989
Analysis:
The change should not affect the existing code. The case that has to be
analyzed is when MaxNewSize is not set on the command line, since the
update of MaxNewSize is guarded by "if (FLAG_IS_DEFAULT(MaxNewSize))".
MaxNewSize is only used in the following files:
- g1CollectorPolicy.cpp:
Guards all the usage of MaxNewSize in if statements:
if (FLAG_IS_CMDLINE(MaxNewSize)) {
...
}
Since this change uses FLAG_SET_DEFAULT, this change won't affect
this code path.
- arguments.cpp:
Only reads MaxNewSize in FLAG_IS_DEFAULT(MaxNewSize) statements.
Otherwise, only writes new values to MaxNewSize that are not based on
the value of MaxNewSize. This code is not affected since the value of
FLAG_IS_DEFAULT(MaxNewSize) is not affected.
- collectorPolicy.cpp:
MaxNewSize is used in a couple of places:
if (NewSize > MaxNewSize) {
MaxNewSize = NewSize;
}
If both NewSize and MaxNewSize have their default values, then
NewSize is ScaleForWordSize(1*M) which will always be less than
MaxNewSize which now is MaxHeapSize. The semantics of the if
statement is only changed if NewSize is set on the command line to a
value larger than MaxHeapSize, which is not a valid case.
if (FLAG_IS_CMDLINE(MaxNewSize) || FLAG_IS_ERGO(MaxNewSize) {
...
} else {
max_new_size = scale_by_NewRatio_aligned(max_heap_byte_size());
max_new_size = MIN2(MAX2(max_new_size, NewSize), MaxNewSize);
}
This "if" check will still follow the "else" branch in the default
case, just as before, since FLAG_SET_DEFAULT is used in this change.
The semantics of the calculation in the else branch is also preserved,
since MAX2(max_new_size, NewSize) will still always be less than
MaxNewSize for all valid values of NewSize.
Testing:
Before the change:
java -XX:+PrintFlagsFinal -version | grep 'MaxHeapSize \| MaxNewSize'
uintx MaxHeapSize := 2017460224 {product}
uintx MaxNewSize = 18446744073709486080 {product}
After the change:
java -XX:+PrintFlagsFinal -version | grep 'MaxHeapSize \| MaxNewSize'
uintx MaxHeapSize := 2017460224 {product}
uintx MaxNewSize = 2015428608 {product}
JPRT
Thanks,
Erik
More information about the hotspot-dev
mailing list