RFR (S): JDK-6348447 - Specifying -XX:OldSize crashes 64-bit VMs

Jesper Wilhelmsson jesper.wilhelmsson at oracle.com
Sat Jan 19 17:38:18 UTC 2013


Hi,

Some further code inspection showed that it's possible to fix this bug in
TwoGenerationCollectorPolicy::initialize_flags() and keep the fix local. 
Thanks to Erik Helin who suggested this. A new webrev is available here:

http://cr.openjdk.java.net/~jwilhelm/6348447/webrev.3/

/Jesper


On 16/1/13 2:23 PM, Vitaly Davidovich wrote:
>
> Looks good Jesper.  Maybe just a comment there that NewRatio hasn't 
> been checked yet but if it's 0, VM will exit later on anyway - 
> basically, what you said in the email :).
>
> Cheers
>
> Sent from my phone
>
> On Jan 16, 2013 7:49 AM, "Jesper Wilhelmsson" 
> <jesper.wilhelmsson at oracle.com <mailto:jesper.wilhelmsson at oracle.com>> 
> wrote:
>
>
>     On 2013-01-16 09:23, Bengt Rutisson wrote:
>>     On 1/15/13 2:41 PM, Jesper Wilhelmsson wrote:
>>>     On 2013-01-15 14:32, Vitaly Davidovich wrote:
>>>>
>>>>     Hi Jesper,
>>>>
>>>>     Is NewRatio guaranteed to be non-zero when used inside
>>>>     recommended_heap_size?
>>>>
>>>     As far as I can see, yes. It defaults to two and is never set to
>>>     zero.
>>
>>     No, there is no such guarantee this early in the argument
>>     parsing. The check to verify that NewRatio > 0 is done in
>>     GenCollectorPolicy::initialize_flags(), which is called later in
>>     the start up sequence than your call to
>>     CollectorPolicy::recommended_heap_size() and it is never called
>>     for G1.
>>
>>     Running with your patch crashes:
>>
>>     java -XX:OldSize=128m -XX:NewRatio=0 -version
>>     Floating point exception: 8
>
>     Oh, yes, you're right. Sorry!
>
>     Good catch Vitaly!
>
>     New webrev:
>     http://cr.openjdk.java.net/~jwilhelm/6348447/webrev.3
>     <http://cr.openjdk.java.net/%7Ejwilhelm/6348447/webrev.3>
>
>     I'm just skipping the calculation if NewRatio is zero. The VM will
>     abort anyway as soon as it realizes that this is the case.
>     /Jesper
>
>
>>     Bengt
>>>     /Jesper
>>>
>>>>     Thanks
>>>>
>>>>     Sent from my phone
>>>>
>>>>     On Jan 15, 2013 8:11 AM, "Jesper Wilhelmsson"
>>>>     <jesper.wilhelmsson at oracle.com
>>>>     <mailto:jesper.wilhelmsson at oracle.com>> wrote:
>>>>
>>>>         Jon,
>>>>
>>>>         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 CollectorPolicy.
>>>>
>>>>
>>>>         A new webrev is available here:
>>>>         http://cr.openjdk.java.net/~jwilhelm/6348447/webrev.2/
>>>>         <http://cr.openjdk.java.net/%7Ejwilhelm/6348447/webrev.2/>
>>>>
>>>>         Thanks,
>>>>         /Jesper
>>>>
>>>>
>>>>
>>>>         On 2013-01-14 19:00, Jon Masamitsu wrote:
>>>>
>>>>             Jesper,
>>>>
>>>>             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?
>>>>
>>>>             Jon
>>>>
>>>>
>>>>             On 01/14/13 09:10, Jesper Wilhelmsson wrote:
>>>>
>>>>                 Hi,
>>>>
>>>>                 I would like a couple of reviews of a small fix for
>>>>                 JDK-6348447 - Specifying -XX:OldSize crashes 64-bit VMs
>>>>
>>>>                 Webrev:
>>>>                 http://cr.openjdk.java.net/~jwilhelm/6348447/webrev/ <http://cr.openjdk.java.net/%7Ejwilhelm/6348447/webrev/>
>>>>
>>>>                 Summary:
>>>>                 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.
>>>>
>>>>                 Changes:
>>>>                 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.
>>>>
>>>>                 Thanks,
>>>>                 /Jesper
>>>>
>>>>
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20130119/a30d587a/attachment.htm>


More information about the hotspot-gc-dev mailing list