RFR(M): 8139867: Change how startsHumongous and continuesHumongous regions work in G1.

David Lindholm david.lindholm at oracle.com
Wed Nov 4 15:30:34 UTC 2015


Tom,

Thank you for looking at this!

On 2015-11-04 15:35, Tom Benson wrote:
> Hi,
> I'm still working through the whole change, but have a 
> comment/question about this:
>
> On 11/4/2015 7:01 AM, David Lindholm wrote:
>>>>    - can we add an assert in HeapRegion::block_is_obj() that the 
>>>> new case
>>>> can only occur with humongous objects, and that p must be in the same
>>>> humongous object?
>>> Ok, fixed.
>
> The assertions imply it can handle an address *within* a humongous 
> object, but I think it will only work for pointers to the object base:
>
>  119   if (!this->is_in(p)) {
>  120     HeapRegion* hr = g1h->heap_region_containing(p);
>  121 #ifdef ASSERT
>  122     assert(hr->is_humongous(), "This case can only happen for 
> humongous regions");
>  123     oop obj = oop(hr->humongous_start_region()->bottom());
>  124     assert((HeapWord*)obj <= p, "p must be in humongous object");
>  125     assert(p <= (HeapWord*)obj + obj->size(), "p must be in 
> humongous object");
>  126 #endif
>  127     return hr->block_is_obj(p);
>  128   }
>
> I think if p != the base of the humongous_start_region(), we should 
> probably just return false from block_is_obj. (Or assert, if you never 
> expect an interior pointer).  Otherwise the recursive call might 
> return true (if p < top()), and then HeapRegion::block_size will be 
> unhappy when it tries to get the object size.   And the call to 
> is_obj_dead(oop(p)...) will also be broken.
> Am I missing something?   Tnx,
> Tom

You are correct. I think that both the current solution and your 
proposal works. In the current solution, "this" will be a 
continousHumongous region and hr will be the startsHumongous region. On 
line 127 block_is_obj() will be called for the other heapRegion (the 
startsHumongous), and it will respond correctly.

However, I like your solution better. I have changed to this:

if (!this->is_in(p)) {
   assert(is_continues_humongous(), "This case can only happen for 
humongous regions");
   return (p == humongous_start_region()->bottom());
}


Thanks,
David


More information about the hotspot-gc-dev mailing list