RFR: 8057536: Refactor G1 to allow context specific allocations
Stefan Johansson
stefan.johansson at oracle.com
Thu Sep 4 19:01:19 UTC 2014
Hi Bengt,
On 2014-09-04 17:07, Bengt Rutisson wrote:
>
>
> Hi Stefan,
>
> On 2014-09-04 14:45, Stefan Johansson wrote:
>> Hi,
>>
>> Please review these changes for:
>> https://bugs.openjdk.java.net/browse/JDK-8057536
>>
>> Webrev:
>> http://cr.openjdk.java.net/~sjohanss/8057536/webrev.00/
>
> Overall I think this i a nice refactoring. Some comments below. Mostly
> style and code comments.
>
Thanks for the in depth review, here's the new webrev and a diff against
the first:
http://cr.openjdk.java.net/~sjohanss/8035057/webrev.01/
http://cr.openjdk.java.net/~sjohanss/8057536/webrev.00-01/
I also had to do a small addition in vm_operations.hpp, which was
forgotten in the previous webrev.
Cheers,
Stefan
> Thanks,
> Bengt
>
>
> G1Allocator.java
>
> //size_t _summary_bytes_used;
> Should probably not be there.
>
Actually this seems to be the way to show what type this field
corresponds to in the VM, see G1CollectedHeap.java for other examples.
>
> G1CollectedHeap.java
>
> public long used() {
> Address g1AllocatorAddr = g1Allocator.getValue(addr);
> G1Allocator allocator = (G1Allocator)
> VMObjectFactory.newObject(G1Allocator.class, g1AllocatorAddr);
> return allocator.getSummaryBytes();
> }
>
> Maybe introduce a allocator() method similar to the hrm() and g1mm()
> methods?
>
Fixed.
>
> g1Allocator.hpp
>
> In this file we are mixing non-indented private, protected, public
> declarations with one-space-indented ones. Would be good to keep the
> same style in the file.
Change all to no space since that was most common already.
>
> Would it be possible to move MutatorAllocRegion, SurvivorGCAllocRegion
> and OldGCAllocRegion into g1AllocRegion.hpp instead?
>
Done.
>
> // Outside of GC pauses, the number of bytes used in all regions other
> // than the current allocation region.
> size_t _summary_bytes_used;
>
> I don't think _summary_bytes_used needs to be aligned with the
> previous instance variable since the comment kind of breaks up the
> alignment anyway.
>
Fixed.
>
>
> if (hr != NULL)
> result += hr->used();
>
> Please add {}.
>
>
Fixed.
>
> class G1ParGCAllocBuffer: public ParGCAllocBuffer {
> private:
> bool _retired;
>
> Alignment of single instance variable not necessary.
>
>
Fixed.
>
> class G1ParGCAllocator : public CHeapObj<mtGC> {
> friend class G1ParScanThreadState;
> protected:
> G1CollectedHeap* _g1h;
>
> size_t _alloc_buffer_waste;
> size_t _undo_waste;
>
> void add_to_alloc_buffer_waste(size_t waste) { _alloc_buffer_waste
> += waste; }
> void add_to_undo_waste(size_t waste) { _undo_waste +=
> waste; }
>
> Alignment...
>
>
Hope you like the new better.
>
> g1AllocationContext.hpp
>
> #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1ALLOCATIONCONTEXT_HPP
>
> Should not be called ...EXT_HPP.
>
But it is, CONTEXT_HPP =) Leaving it as is, for now.
>
> typedef unsigned char AllocationContext_t;
>
> Don't think we normally call types _t.
>
>
Not sure why we/I did this, will open a bug about changing that later,
and maybe do some more refactoring around it.
>
> g1AllocRegion.cpp
>
> G1AllocRegion::uupdate_alloc_region(). Second call to trace() should
> probably be trace("updated").
>
Fixed.
> G1AllocRegion::G1AllocRegion(). I would prefer if there was a special
> value in AllocationContext that could be used as a default value
> rather than using 0 explicitly in the initialization list here.
> _allocation_context(0).
>
I like this, but I'm not sure what's the best way. I added a system()
method similar to current(), which returns the system context (could not
use default).
> g1CollectedHeap.hpp
>
> Same as above. Calls like AllocationContext_t context = 0 kind of
> leaks what we are trying to hide with the AllocationContext_t type.
> Would be better with an explicit default value in AllocationContext.
> (Holds for this call in g1CollectedHeap.cpp too:
> r->set_allocation_context(0) and in heapRegion.hpp
> "AllocationContext_t context = 0" and in heapRegion.cpp:
> "set_allocation_context(0)".)
>
>
Using AllocationContext::system() for those as well.
>
> // Allocation attempt during GC for a survivor object / PLAB.
> inline HeapWord* survivor_attempt_allocation(size_t word_size,
> AllocationContext_t context);
>
> // Allocation attempt during GC for an old object / PLAB.
> inline HeapWord* old_attempt_allocation(size_t word_size,
> AllocationContext_t context);
>
>
> Alignment.
>
>
Fixed.
>
> g1CollectedHeap.cpp
>
> I think the newline after this comment should be left as it was:
> // Methods for the GC alloc regions
>
>
Yes, done.
>
> g1CollectedHeap.inline.hpp
>
> inline HeapWord* G1CollectedHeap::survivor_attempt_allocation(size_t
> word_size,
> AllocationContext_t context) {
>
> inline HeapWord* G1CollectedHeap::old_attempt_allocation(size_t
> word_size,
> AllocationContext_t
> context) {
> Alignment.
>
>
Fixed.
>
> g1ParScanThreadState.cpp
>
> G1ParScanThreadState::~G1ParScanThreadState()
> Can we introduce a G1ParGCAllocator::relese_allocator() instead of
> doing "delete _g1_par_allocator"?
>
That would require to pass the _g1_par_allocator along to release and
then do the delete in there. I can add this if you prefer but otherwise
keep it as is.
> heapRegion.cpp
>
> void HeapRegion::print_on(outputStream* st) const {
> st->print("Context: %4u", allocation_context());
>
> Is it worth trying to hide the formatting of allocation_context?
>
I see your point, I shortened it to AC%4u for now since Mikael wanted a
more compact output. This might be something to do if we re-design the
allocation context.
>
>>
>> Summary:
>> These changes are made to allow G1 to do context specific allocation.
>> As part of this a G1Allocator class has be refactored out of
>> G1CollectedHeap which can be extended to implement the specific
>> context code. Currently only the G1DefaultAllocator is implemented,
>> this allocator only makes use of one context to have the same
>> behavior as prior to this enhancement.
>>
>> Testing:
>> * JPRT
>> * Manual verification
>> * Local ute runs of vm.quick.testlist
>>
>> Thanks,
>> Stefan
>
More information about the hotspot-gc-dev
mailing list