Request for review (S): 7113021 G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
Bengt Rutisson
bengt.rutisson at oracle.com
Wed Dec 21 22:07:35 UTC 2011
Hi John,
Thanks for the review!
Some comments inline.
On 2011-12-21 19:04, John Cuthbertson wrote:
> Hi Bengt,
>
> Looks good except for the following couple of items:
>
> g1_globals.hpp:
>
> 294 develop(uintx, G1DefaultMinNewGenPercent,
> 20, \
> 295 "Percentage (0-100) of the heap size to use as
> minunimum " \
> 296 "young gen
> size.") \
>
> Should be "minimum".
>
> 298 develop(uintx, G1DefaultMaxNewGenPercent,
> 50, \
> 299 "Percentage (0-100) of the heap size to use as
> minunimum " \
> 300 "young gen size.")
>
> Should be "maximum".
Thanks for detecting this! Fixed it.
> g1CollectorPolicy.[ch]pp:
>
> Can you rename calculate_default_min_size() to be something like
> "calculate_default_min_region_num()"? Similarly for
> calculate_default_max_size(). They return a number of regions rather
> than a size in bytes.
Good point. How about calculate_default_min_length() since the variables
we set are called *_length and I think we often refer to the young gen
"size" as the length?
Here is an updated webrev:
http://cr.openjdk.java.net/~brutisso/7113021/webrev.04/
Thanks again for the review!
Bengt
>
> Regards,
>
> JohnC
>
>
> On 12/21/2011 4:22 AM, Bengt Rutisson wrote:
>>
>> Tony,
>>
>> Thanks for the review!
>>
>> Good comments. I fixed them. Here is an updated webrev:
>> http://cr.openjdk.java.net/~brutisso/7113021/webrev.03/
>>
>> Bengt
>>
>> On 2011-12-21 10:21, Tony Printezis wrote:
>>> Bengt,
>>>
>>> First, to repeat what I told you privately the other day: I really
>>> liked the fact that you introduced the enum for the sizing policy.
>>> It makes the code much easier to understand. I only have a couple of
>>> minor comments:
>>>
>>> g1CollectorPolicy.cpp:
>>>
>>> Instead of having the asserts:
>>>
>>> 448 assert(G1DefaultMinNewGenPercent<= G1DefaultMaxNewGenPercent,
>>> "Min larger than max");
>>> 449 assert(G1DefaultMinNewGenPercent> 0&&
>>> G1DefaultMinNewGenPercent< 100, "Min out of bounds");
>>>
>>> 456 assert(G1DefaultMinNewGenPercent<= G1DefaultMaxNewGenPercent,
>>> "Min larger than max");
>>> 457 assert(G1DefaultMaxNewGenPercent> 0&&
>>> G1DefaultMaxNewGenPercent< 100, "Max out of bounds");
>>>
>>> at the start of calculate_default_{min,max}_size(), why don't you
>>> just do those checks once in the G1YoungGenSizer constructor (i.e.,
>>> treat them like product params)?
>>>
>>>
>>> g1CollectorPolicy.hpp:
>>>
>>> 100 // If only -XX:NewSize is set we should use the specified value
>>> as the
>>> 101 // minimum size for young gen. Still using 50% of the heap as
>>> maximum.
>>> 102 //
>>> 103 // If only -XX:MaxNewSize is set we should use the specified
>>> value as the
>>> 104 // maximum size for young gen. Still using 20% of the heap as
>>> minimum.
>>>
>>> Instead of saying 20% and 50%, why don't you just refer to the two
>>> develop parameters, as those might change in the future?
>>>
>>> Apart from that, looks great! Ship it.
>>>
>>> Tony
>>>
>>>
>>> On 12/19/2011 07:48 AM, Bengt Rutisson wrote:
>>>>
>>>> Hi everyone,
>>>>
>>>> Could I have a couple of reviews for this change?
>>>> http://cr.openjdk.java.net/~brutisso/7113021/webrev.02/
>>>>
>>>> The idea is to give G1 some room to allow it to use its heuristics
>>>> for calculating the young gen size even when the heap size is fixed.
>>>>
>>>> CR:
>>>> 7113021 G1: automatically enable young gen size auto-tuning when
>>>> -Xms==-Xmx
>>>> http://monaco.us.oracle.com/detail.jsf?cr=7113021
>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7113021
>>>>
>>>> I introduce two new develop flags, G1DefaultMinNewGenPercent and
>>>> G1DefaultMaxNewGenPercent. I will try to get the performance team
>>>> to evaluate some good default values for these flags. Right now
>>>> they are 20 and 50 respectively. This might change if we find that
>>>> some other values are more appropriate.
>>>>
>>>> Background:
>>>>
>>>> There are three command line options related to the young gen size:
>>>> NewSize, MaxNewSize and NewRatio (There is also -Xmn, but that is
>>>> just a short form for NewSize==MaxNewSize). G1 will use its
>>>> internal heuristics to calculate the actual young gen size, so
>>>> these options basically only limit the range within which G1 can
>>>> pick a young gen size. Also, these are general options taking byte
>>>> sizes. G1 will internally work with a number of regions instead.
>>>> So, some rounding will occur.
>>>>
>>>> The idea is that my fix should work pretty much as follows:
>>>>
>>>> If nothing related to the the young gen size is set on the command
>>>> line we should allow the young gen to be between 20% and 50% of the
>>>> heap size. This means that every time the heap size changes the
>>>> limits for the young gen size will be updated.
>>>>
>>>> If only -XX:NewSize is set we should use the specified value as the
>>>> minimum size for young gen. Still using 50% of the heap as maximum.
>>>>
>>>> If only -XX:MaxNewSize is set we should use the specified value as
>>>> the maximum size for young gen. Still using 20% of the heap as
>>>> minimum.
>>>>
>>>> If -XX:NewSize and -XX:MaxNewSize are both specified we use these
>>>> values. No updates when the heap size changes. There is a special
>>>> case when NewSize==MaxNewSize. This is interpreted as "fixed" and
>>>> will use a different heuristic for calculating the collection set
>>>> when we do mixed collection.
>>>>
>>>> If only -XX:NewRatio is set we should use the specified ratio of
>>>> the heap as both min and max. This will be interpreted as "fixed"
>>>> just like the NewSize==MaxNewSize case above. But we will update
>>>> the min and max everytime the heap size changes.
>>>>
>>>> NewSize and MaxNewSize override NewRatio. So, NewRatio is ignored
>>>> if it is combined with either NewSize or MaxNewSize. (A warning
>>>> message is printed.)
>>>>
>>>> Thanks,
>>>> Bengt
>>
>
More information about the hotspot-gc-dev
mailing list