RFR(S) 8015255: NPG: Don't waste fragment at the end of a VirtualSpaceNode before retiring it.
Mikael Gerdin
mikael.gerdin at oracle.com
Thu Oct 17 15:38:46 UTC 2013
Stefan,
On Thursday 17 October 2013 17.31.34 Stefan Karlsson wrote:
> On 10/17/13 5:09 PM, Mikael Gerdin wrote:
> > Stefan,
> >
> > Thanks for looking at this, I've replied to your comments inline.
> >
> > On Thursday 17 October 2013 16.15.03 Stefan Karlsson wrote:
> >> On 2013-10-17 14:56, Mikael Gerdin wrote:
> >>> Hi all,
> >>>
> >>> Please review this change to fix needless memory waste in Metaspace.
> >>>
> >>> Description of problem:
> >>> When receiving an allocation request which cannot be satisfied with the
> >>> current VirtualSpaceNode the remaining committed memory in the current
> >>> node is wasted when a new node is created and the allocation is
> >>> satisfied
> >>> from the new node.
> >>>
> >>> Suggested fix:
> >>> Before creating a new VirtualSpaceNode, "retire" the current node by
> >>> allocating chunks of decreasing size from the committed memory present
> >>> in
> >>> the current node.
> >>> To ensure that allocating chunks at the end of a node uses all committed
> >>> memory I've increased the size alignment for humongous chunks to the
> >>> smallest chunk size. I don't foresee this increasing memory waste since
> >>> previously the memory difference between 2-word-aligned sizes and
> >>> smallest chunk-aligned would go unused since no chunk would fit there.
> >>>
> >>> Testing:
> >>> Added new unit tests for VirtualSpaceNode and the retire functionality.
> >>> JPRT run (including the new unit tests)
> >>>
> >>> Webrev: http://cr.openjdk.java.net/~mgerdin/8015255/webrev.0/
> >>> Buglink: https://bugs.openjdk.java.net/browse/JDK-8015255
> >>
> >> Very nice.
> >>
> >> Some comments:
> >>
> >> Would it make more sense to move the call to
> >> retire_current_virtual_space() into create_new_virtual_space() or
> >> link_vs()?>
> > If I do that I would need to first check if there is a current virtual
> > space, since create_new_virtual_space() (and and its callee link_vs())
> > are called when a VirtualSpaceList is first created.
> > I'd rather keep it in the current place in the code, where I don't need to
> > wrap it with if (current_virtual_space() != NULL) {}
>
> I think it makes more sense to retire the current virtual space when
> it's actually being replaced by a new virtual space.
>
> We already have the needed check in link_vs:
> void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
> if (virtual_space_list() == NULL) {
> set_virtual_space_list(new_entry);
> }
I see your point, but I feel like the call would be lost in the manual linked
list management in that if-else-statement.
>
> But if you don't want to do it I'm not going to fight for it.
I'd prefer to keep it as-is.
>
> >> I think some punctation is missing between the two first lines:
> >> + // If an allocation doesn't fit in the current node a new node is
> >> created + // allocate chunks out of the remaining committed space in
> >> this node + // to avoid wasting that memory.
> >
> > Fixed
> >
> >> I think you have an extra "the" in this sentence:
> >> + // This always adds up because the all the chunk sizes are multiples
> >> of
> >> + // the smallest chunk size.
> >
> > Fixed
> >
> >> The other usages of HumongousChunkGranularity have to be changed to
> >> smallest_chunk_size().
> >
> > Fixed, and removed HumongousChunkGranularity
> >
> >> I had a hard time understanding this test:
> >> + { // 4 pages of VSN is committed, some is used by chunks
> >>
> >> could you change this line:
> >> + const size_t page_chunks = MIN2(4 * (size_t)os::vm_page_size() /
> >> BytesPerWord, vsn_test_size_words);
> >>
> >> to:
> >> const size_t page_chunks = 4 * (size_t)os::vm_page_size() /
> >>
> >> BytesPerWord;
> >>
> >> and add an assert that 4 * (size_t)os::vm_page_size() is less than a
> >> MediumChunk (or less than MediumChunk + SmallChunk + SpecializedChunk)?
> >
> > Good point, I changed it as you suggested. I added an assert that
> > (page_chunks < MediumChunk)
> >
> > Incremental webrev:
> > http://cr.openjdk.java.net/~mgerdin/8015255/webrev.0-to-1/ New webrev:
> > http://cr.openjdk.java.net/~mgerdin/8015255/webrev.1/
>
> Great! Looks good.
Thanks for reviewing!
/Mikael
>
> thanks,
> StefanK
>
> > /Mikael
> >
> >> thanks,
> >> StefanK
> >>
> >>> /Mikael
More information about the hotspot-gc-dev
mailing list