RFR (S): JDK-6348447 - Specifying -XX:OldSize crashes 64-bit VMs
jesper.wilhelmsson at oracle.com
Tue Jan 15 13:07:17 UTC 2013
Thank you for looking at this! I share your concerns and I have moved the
knowledge about policies to CollectorPolicy. set_heap_size() now simply asks
the collector policy if it has any recommendations regarding the heap size.
Ideally, since the code knows about young and old generations, I guess the new
function "recommended_heap_size()" should be placed in GenCollectorPolicy, but
then the code would have to be duplicated for G1 as well. However,
CollectorPolicy already know about OldSize and NewSize so I think it is OK to
put it there.
Eventually I think that we should reduce the abstraction level in the
generation policies and merge CollectorPolicy, GenCollectorPolicy and maybe
even TwoGenerationCollectorPolicy and if possible G1CollectorPolicy, so I
don't worry too much about having knowledge about the two generations in
A new webrev is available here:
On 2013-01-14 19:00, Jon Masamitsu wrote:
> I'm a bit concerned that set_heap_size() now knows about how
> the CollectorPolicy uses OldSize and NewSize. In the distant
> past set_heap_size() did not know what kind of collector was
> going to be used and probably avoided looking at those
> parameters for that reason. Today we know that a generational
> collector is to follow but maybe you could hide that knowledge
> in CollectorPolicy somewhere and have set_heap_size() call into
> CollectorPolicy to use that information?
> On 01/14/13 09:10, Jesper Wilhelmsson wrote:
>> I would like a couple of reviews of a small fix for JDK-6348447 -
>> Specifying -XX:OldSize crashes 64-bit VMs
>> When starting HotSpot with an OldSize larger than the default heap size one
>> will run into a couple of problems. Basically what happens is that the
>> OldSize is ignored because it is incompatible with the heap size. A debug
>> build will assert since a calculation on the way results in a negative
>> number, but since it is a size_t an if(x<0) won't trigger and the assert
>> catches it later on as incompatible flags.
>> I have made two changes to fix this.
>> The first is to change the calculation in
>> TwoGenerationCollectorPolicy::adjust_gen0_sizes so that it won't result in
>> a negative number in the if statement. This way we will catch the case
>> where the OldSize is larger than the heap size and adjust the OldSize
>> instead of the young size. There are also some cosmetic changes here. For
>> instance the argument min_gen0_size is actually used for the old generation
>> size which was a bit confusing initially. I renamed it to min_gen1_size
>> (which it already was called in the header file).
>> The second change is in Arguments::set_heap_size. My reasoning here is that
>> if the user sets the OldSize we should probably adjust the heap size to
>> accommodate that OldSize instead of complaining that the heap is too small.
>> We determine the heap size first and the generation sizes later on while
>> initializing the VM. To be able to fit the generations if the user
>> specifies sizes on the command line we need to look at the generation size
>> flags a little already when setting up the heap size.
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 247 bytes
Desc: not available
More information about the hotspot-gc-dev