RFR (M): JDK-8040722: G1: Clean up usages of heap_region_containing

Bengt Rutisson bengt.rutisson at oracle.com
Thu Apr 17 08:26:22 UTC 2014


Hi again,

Here's an updated webrev:
http://cr.openjdk.java.net/~brutisso/8040722/webrev.01/

And here's the incremental change compared to the previous one:
http://cr.openjdk.java.net/~brutisso/8040722/webrev.00-01.diff/

Thanks,
Bengt


On 2014-04-17 01:15, Jon Masamitsu wrote:
>
> On 4/16/2014 12:08 PM, Bengt Rutisson wrote:
>>
>> Hi Jon,
>>
>> Thanks for looking at this!
>>
>> On 4/16/14 6:06 PM, Jon Masamitsu wrote:
>>> Bengt,
>>>
>>> http://cr.openjdk.java.net/~brutisso/8040722/webrev.00/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp.frames.html 
>>>
>>>>    45 G1CollectedHeap::heap_region_containing_raw(const T addr) 
>>>> const {
>>>>    46   assert(addr != NULL, "invariant");
>>> heap_region_containing_raw() does an assertion check against
>>> null and heap_region_containing() uses heap_region_containing_raw()
>>> so is the null checking assertion at calls to 
>>> heap_region_containing() useful?
>>> For example here
>>>
>>> http://cr.openjdk.java.net/~brutisso/8040722/webrev.00/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp.frames.html 
>>>
>>>
>>> 2953 Space* G1CollectedHeap::space_containing(const void* addr) const {
>>> 2954   assert(addr != NULL, "invariant");
>>> 2955   return heap_region_containing(addr);
>>
>> I'm fine with removing these asserts, I just figured that it would be 
>> nice to catch any issues one frame earlier than in 
>> heap_region_containing(). But provided that we get good stack traces 
>> I guess it is fine to let the assert in heap_region_containing_raw() 
>> catch the issues.
>>
>> Unless anybody else objects I'll remove those extra asserts.
>
> Seems 1 less line of code in several places but I'm fine with either way.
>
>>>
>>> http://cr.openjdk.java.net/~brutisso/8040722/webrev.00/src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp.frames.html 
>>>
>>>
>>>>    32   assert(addr != NULL, "addr must be != NULL");
>>>>    33   assert(addr < heap_end(),
>>>>    34                 err_msg("addr: "PTR_FORMAT" end: "PTR_FORMAT, 
>>>> addr, heap_end()));
>>>>    35   assert(addr >= heap_bottom(),
>>>>    36         err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT, 
>>>> addr, heap_bottom()));
>>>>    37
>>>
>>> Don't need assertion at 32.  Assertion at 35 should caught the addr 
>>> !=NULL case or
>>> heap_bottom() is NULL in which case addr == NULL is a legal address.
>>
>> Right. I was actually going back and forth on this assert anyway. 
>> I'll remove it.
>
> Thanks.
>
>>
>>>
>>> heap_region_containing_raw() no longer does the check for 
>>> continuousHumongous.
>>> heap_region_containing_raw() is called from lots of places. For 
>>> example,
>>>
>>>  130 inline void ConcurrentMark::count_region(MemRegion mr, uint 
>>> worker_id) {
>>>  131   HeapWord* addr = mr.start();
>>>  132   HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
>>>  133   count_region(mr, hr, worker_id);
>>>  134 }
>>>
>>> Is that OK?  Should it now call heap_region_containing()?
>>
>> I think you missed that heap_region_containing_raw() and 
>> heap_region_containing() have switched places in 
>> g1CollectedHeap.inline.hpp. I had to do that to get the inlining 
>> right now when heap_region_containing() calls 
>> heap_region_containing_raw().
>>
>> So, heap_region_containing_raw() has not changed. Thus, all calls to 
>> it should still be correct.
>
> Ok.
>
>>
>>>
>>> Maybe we can improve on the name heap_region_containing_raw()
>>> (the "raw" conveying little information).
>>>
>>> Would
>>>
>>> heap_region_containing_raw -> 
>>> heap_region_containing_ignore_continuousHumongous
>>>
>>> be an improvement.  A bit long, I'll admit.  I'm OK with
>>> heap_region_containing_ICH if the declaration explained what
>>> the ICH stood for.
>>
>> I agree that heap_region_containing_raw() is not a great name. 
>> However, it does not ignore continues humongous regions. It is 
>> heap_region_containing() that does that. So, I guess your naming 
>> suggestion would be for heap_region_containing() to change to 
>> heap_region_containing_ignore_continues_humongous(), right?
>>
>> With my patch for allocating objects into the last continues region 
>> of a humongous object heap_region_containing() will also be able to 
>> return continues regions occasionally. So, I'm not convinced about 
>> the name.
>>
>> Would it be ok to leave the names as they are for now?
>
> That's fine.  That will give us a chance to come up with an
> even better name.
>
> Reviewed.
>
> Jon
>
>>
>> Thanks,
>> Bengt
>>>
>>> Jon
>>>
>>> On 4/16/2014 6:46 AM, Bengt Rutisson wrote:
>>>>
>>>> Hi everyone,
>>>>
>>>> Could I please have a few reviews of this cleanup?
>>>>
>>>> http://cr.openjdk.java.net/~brutisso/8040722/webrev.00/
>>>>
>>>> Background:
>>>>
>>>> Before the perm gen was removed 
>>>> G1CollectedHeap::heap_region_containing() could return NULL for 
>>>> addresses in the perm gen. This means that a lot of code had to 
>>>> check the result since it could potentially be NULL.
>>>>
>>>> Now the only reason to return NULL is if the address passed in 
>>>> NULL. In many places it is possible to know that the address is not 
>>>> NULL and in the other places it is just as simple to check the 
>>>> address for NULL before calling 
>>>> G1CollectedHeap::heap_region_containing() rather than checking for 
>>>> NULL after having called it.
>>>>
>>>> So, to simplify the code a bit we can assert that 
>>>> G1CollectedHeap::heap_region_containing() never returns NULL and 
>>>> then only check before we call it in the places where we would 
>>>> otherwise have passed NULL to it.
>>>>
>>>> Thanks,
>>>> Bengt
>>>
>>
>




More information about the hotspot-gc-dev mailing list