Review request: 8024547: MaxMetaspaceSize should limit the committed memory used by the metaspaces

Coleen Phillimore coleen.phillimore at oracle.com
Wed Oct 9 06:04:59 PDT 2013


Thanks - fine on all issues, ship it!
Coleen

On 10/9/2013 5:15 AM, Stefan Karlsson wrote:
> Here's the fixes for the issues I agreed with you on:
> http://cr.openjdk.java.net/~stefank/8024547/webrev.01.delta/
>
> Here's the full patch:
> http://cr.openjdk.java.net/~stefank/8024547/webrev.01/
>
> Jon suggested that I should document in globals.hpp that 
> UseLargePagesInMetaspace is only used when UseLargePages is true.
>
> thanks,
> StefanK
>
> On 10/9/13 8:56 AM, Stefan Karlsson wrote:
>>
>> On 2013-10-09 00:33, Coleen Phillimore wrote:
>>>
>>> In metaspace.cpp:
>>>
>>> *+ static bool should_reserve_large_pages(size_t bytes) {*
>>> *+   if (UseLargePages && UseLargePagesInMetaspace && 
>>> !os::can_commit_large_page_memory()) {*
>>>
>>> Isn't UseLargePagesInMetaspace true only if UseLargePages is true?
>>
>> Not in the current version of the code.
>>
>>>
>>> I like assert_size_is_aligned, assert_ptr_is_aligned now you get 
>>> more info if assert hits too.
>>>
>>> Below, this comment doesn't seem to match the function name even 
>>> though inside you test whether you can commit large pages (vs. 
>>> reserving large pages).  Putting a comment about the restriction 
>>> about can_commit_large_pages should be inside 
>>> should_reserve_large_pages.   It's sort of surprising there when you 
>>> only look once.  It looked like a bug at first.
>>>
>>> *+      // Decide if large pages should be commmitted when the 
>>> memory is reserved.*
>>> *+     bool large_pages = should_reserve_large_pages(bytes);*
>>> *+*
>>> *+     _rs = ReservedSpace(bytes, Metaspace::reserve_alignment(), 
>>> large_pages);*
>>
>> OK. How about a longer name: 
>> should_commit_large_pages_when_reserving(bytes), and get rid of/move 
>> the comment?
>>
>>>
>>>
>>>
>>> 1167     assert(false, "vs_word_size should always be at least 
>>> _reserve_alignement large.");
>>>
>>>
>>> Typeo.
>>
>> Thanks.
>>
>>>
>>>   if (is_class()) {
>>>     assert(false, "We currently don't support more than one 
>>> VirtualSpace for"
>>>                   " the compressed class space. The initialization 
>>> of the"
>>>                   " CCS uses another code path and should not hit 
>>> this path.");
>>>     return false;
>>>   }
>>>
>>> Why not just assert(!is_class(), "with the message")  It would take 
>>> less lines so I can get the rest of the function on the page.
>>>
>>> And the assert below it?  or guarantee() if you are worried about 
>>> this happening in production (I hope not!)
>>
>> It's just defensive programming. If we end up hitting this code path 
>> in production builds, the code will still work as it's currently 
>> written.
>>
>>>
>>>
>>> Metachunk* VirtualSpaceList::get_initialization_chunk(size_t 
>>> chunk_word_size,
>>>                                                       size_t 
>>> chunk_bunch) {
>>>   // Get a chunk from the chunk freelist
>>>   Metachunk* new_chunk = get_new_chunk(chunk_word_size,
>>>                                        chunk_word_size,
>>>                                        chunk_bunch);
>>>   return new_chunk;
>>> }
>>>
>>> Can we just call get_new_chunk from the other 
>>> get_initialization_chunk and remove this?  There are so many 
>>> functions with the same names, and it looks like this used to do 
>>> more by the comment.
>>
>> Will do.
>>
>>>
>>> I don't have any other comments now.  I think this looks really good 
>>> and thank you for resolving the MaxMetaspaceSize problem!
>>
>> Thanks, Coleen!
>>
>> StefanK
>>
>>>
>>> Coleen
>>>
>>> On 10/08/2013 02:21 AM, Stefan Karlsson wrote:
>>>> Please, review this patch to limit the committed Metaspace memory 
>>>> against the MaxMetaspaceSize flag.
>>>>
>>>> http://cr.openjdk.java.net/~stefank/8024547/webrev.00
>>>>
>>>> 8024547: MaxMetaspaceSize should limit the committed memory used by 
>>>> the metaspaces
>>>> Reviewed-by: TBD1, TBD2
>>>>
>>>> To simplify the code, the patch is strict about the alignments used 
>>>> to commit and reserve memory in the metaspaces. The Metaspace 
>>>> VirtualSpaces always have addresses and sizes that are aligned 
>>>> against Metaspace::reserve_alignment(). The reserve alignment is 
>>>> os::vm_allocation_granularity() if small pages are used or 
>>>> os::large_page_size() if large pages are used in the Metaspace. The 
>>>> memory is always committed in regions that are size aligned against 
>>>> Metaspace::commit_alignment(). The commit alignment is 
>>>> os:page_size() if small pages are used or os::large_page_size() if 
>>>> late pages are used in the Metaspace. The user can specify the flag 
>>>> -XX:+UseLargePagesInMetaspace to turn on large pages in the 
>>>> metaspaces.
>>>>
>>>> The flag initialization was moved out of the CollectorPolicy class. 
>>>> The Metaspace specific flags have been changed to be commit/reserve 
>>>> aligned instead of using heap specific alignments.
>>>>
>>>> The output from PrintHeapAtGC has been changed. The redundant "data 
>>>> space" section has been removed. All of used, capacity, committed 
>>>> and reserved are printed. Example:
>>>>  Metaspace       used 7644K, capacity 7700K, committed 7808K, 
>>>> reserved 1056768K
>>>>   class space    used 804K, capacity 822K, committed 896K, reserved 
>>>> 1048576K
>>>>
>>>> Thanks go out to the engineers who have helped out with this bug: 
>>>> Erik, Mikael and Bengt for helping out with parts of the code and 
>>>> testing. Bengt, Coleen, Jesper and Jon for pre-reviewing the 
>>>> changes and providing early feedback.
>>>>
>>>> thanks,
>>>> StefanK
>>>
>>
>



More information about the hotspot-dev mailing list