RFR: 8047818: G1 HeapRegions can no longer be ContiguousSpaces
Jon Masamitsu
jon.masamitsu at oracle.com
Tue Jun 24 16:34:57 UTC 2014
On 06/24/2014 07:43 AM, Mikael Gerdin wrote:
> Jon,
>
> On Tuesday 24 June 2014 07.26.52 Jon Masamitsu wrote:
>> Mikael,
>>
>> Did you consider creating a base class for ContiguousSpace and
>> G1OffsetTableContigSpace that has a _top but does not assume
>> parsability?
> I did consider it but I thought that the added complexity of having even more
> levels of inheritance were not worth the benefit of sharing the _top field.
> Especially since G1 attempts to hack around the semantics around the _top
> field with respect to concurrent access. See the disjunction I removed from
> allocate_impl and when G1 calls cas_allocate and allocate.
Ok. That's enough of a reason.
>
>> Could allocate_inner() have been called allocate_impl() as it is
>> in ContiguousSpace? I don't know what the "inner" in the name
>> is telling me.
> "inner" tries to signal that this function is internal and wrapped by other
> methods providing the external API. I don't have a particular naming
> preference here, if the other reviewers are fine with "impl" or don't have a
> preference I'm fine with changing it.
If no one objects, the "impl" has more of a meaning to me.
http://cr.openjdk.java.net/~mgerdin/8047818/webrev/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp.frames.html
You use the if-then {return ...} return NULL style.
52 inline HeapWord* G1OffsetTableContigSpace::allocate_inner(size_t size) {
53 HeapWord* obj = top();
54 if (pointer_delta(end(), obj) >= size) {
55 HeapWord* new_top = obj + size;
56 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
57 set_top(new_top);
58 return obj;
59 }
60 return NULL;
61 }
The ContiguousSpace uses the if-then {return ...} else {return NULL} style.
Any reason not to use the same style?
block_is_obj() seems more like an is_in() method.
89 inline bool
90 HeapRegion::block_is_obj(const HeapWord* p) const {
91 return p < top();
92 }
Could you add a specification for this block_size()?
94 inline size_t
95 HeapRegion::block_size(const HeapWord *addr) const {
96 const HeapWord* current_top = top();
97 if (addr < current_top) {
98 return oop(addr)->size();
99 } else {
100 assert(addr == current_top, "just checking");
101 return pointer_delta(end(), addr);
102 }
103 }
Jon
>
>> I've just started on the review so more to come.
> Great!
>
> Thanks
> /Mikael
>
>> Jon
>>
>> On 06/23/2014 07:26 AM, Mikael Gerdin wrote:
>>> Hi!
>>>
>>> When G1 is modified to unload classes without doing full collections the
>>> old HeapRegions can contain unparseable objects. This makes
>>> ContiguousSpace unsuitable as a base class for HeapRegion since it
>>> assumes that all objects below _top are parseable.
>>>
>>> Modify G1OffsetTableContigSpace to implement allocation with a separate
>>> _top and reimplement some Space pure virtuals to make object iteration
>>> work as expected.
>>>
>>> This change is the last part of a set of 4 changes: 8047818, 8047819,
>>> 8047820, 8047821 which are needed to refactor the HeapRegion class and
>>> its superclasses in order to simplify the G1 class unloading change which
>>> is coming. This change depends on the 19, 20 and 21 changes.
>>>
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8047818
>>> Webrev:
>>> http://cr.openjdk.java.net/~mgerdin/8047818/webrev/
>>>
>>> Notes:
>>> The moving of set_offset_range is due to an introduced circular dependency
>>> between g1BlockOffsetTable.inline.hpp and heapRegion.inline.hpp
>>>
>>> Thanks
>>> /Mikael
More information about the hotspot-gc-dev
mailing list