RFR(M): 8139867: Change how startsHumongous and continuesHumongous regions work in G1.
David Lindholm
david.lindholm at oracle.com
Thu Nov 5 13:00:28 UTC 2015
Tom,
Thanks for your comments!
On 2015-11-04 22:49, Tom Benson wrote:
> Hi David,
> Thanks for updating that. My only other comments are pretty trivial.
>
> concurrentMark.cpp:
>
> 1438 // For start_humongous regions, the size of the whole object
> will be
> 1439 // in exp_marked_bytes, so this check does not apply in this
> case.
> 1440 if (exp_marked_bytes > act_marked_bytes &&
> !hr->is_starts_humongous()) {
> 1441 failures += 1;
> 1442 }
>
> Couldn't you still do the check if the humongous obj doesn't exceed
> this region? IE, the check could be
> ... && (!hr->is_starts_humongous() || exp_marked_bytes <=
> HeapRegion::GrainBytes)
I don't think I can, since ext_marked_bytes will be the objectsize of
the humongous object. But instead I
added this check:
(num_regions-1) * HeapRegion::GrainBytes < exp_marked_bytes <=
num_regions * HeapRegion::GrainBytes
> heapRegion.hpp:
>
> 48 // .... If the humongous
> 49 // object is larger than a heap region, the following regions will
> 50 // be of type ContinuesHumongous. In this case the top() and end()
> 51 // of the StartHumongous region will point to the end of that
> region.
> 52 // The same will be true for all ContinuesHumongous regions except
> 53 // the last, which will have its' top() at the objects' top.
>
> Wording suggestions: I think "the end of that region" is a little
> ambiguous. And since end() never changes (and you say that
> elsewhere), that can be left out. Perhaps something like:
>
> ... In this case the top() of the StartHumongous region and all
> ContinuesHumongous regions except the last will point to their own
> end.
> For the last ContinuesHumongous region, top() will equal the
> object's top.
Yes, your wording is better. I changed to that.
> g1CollectedHeap.hpp/cpp and heapRegionManager.hpp/cpp:
>
> Could next_humongous_region be called next_region_in_humongous (or
> perhaps, humongous_object_continuation) to clarify it isn't just the
> next humongous region in the heap, but a continuation of the current
> humongous object? I know, it's hard to get too excited by that...
Yes, you are correct. Changed to next_region_in_humongous instead.
Tom and Thomas, could you both please look at the latest webrev:
http://cr.openjdk.java.net/~david/JDK-8139867/webrev.04/
http://cr.openjdk.java.net/~david/JDK-8139867/webrev.03-04/ (diff)
Thanks,
David
> Thanks,
> Tom
>
>
> On 11/4/2015 10:30 AM, David Lindholm wrote:
>> 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