comparison src/share/vm/gc_implementation/g1/g1AllocRegion.hpp @ 20404:227a9e5e4b4a

8057536: Refactor G1 to allow context specific allocations Summary: Splitting out a g1 allocator class to simply specialized allocators which can associate each allocation with a given context. Reviewed-by: mgerdin, brutisso
author sjohanss
date Fri, 05 Sep 2014 09:49:19 +0200
parents 18bf0b66de52
children 7848fc12602b
comparison
equal deleted inserted replaced
20403:8ec8971f511a 20404:227a9e5e4b4a
55 // then _alloc_region is NULL and this object should not be used to 55 // then _alloc_region is NULL and this object should not be used to
56 // satisfy allocation requests (it was done this way to force the 56 // satisfy allocation requests (it was done this way to force the
57 // correct use of init() and release()). 57 // correct use of init() and release()).
58 HeapRegion* volatile _alloc_region; 58 HeapRegion* volatile _alloc_region;
59 59
60 // Allocation context associated with this alloc region.
61 AllocationContext_t _allocation_context;
62
60 // It keeps track of the distinct number of regions that are used 63 // It keeps track of the distinct number of regions that are used
61 // for allocation in the active interval of this object, i.e., 64 // for allocation in the active interval of this object, i.e.,
62 // between a call to init() and a call to release(). The count 65 // between a call to init() and a call to release(). The count
63 // mostly includes regions that are freshly allocated, as well as 66 // mostly includes regions that are freshly allocated, as well as
64 // the region that is re-used using the set() method. This count can 67 // the region that is re-used using the set() method. This count can
108 // Retire the active allocating region. If fill_up is true then make 111 // Retire the active allocating region. If fill_up is true then make
109 // sure that the region is full before we retire it so that noone 112 // sure that the region is full before we retire it so that noone
110 // else can allocate out of it. 113 // else can allocate out of it.
111 void retire(bool fill_up); 114 void retire(bool fill_up);
112 115
116 // After a region is allocated by alloc_new_region, this
117 // method is used to set it as the active alloc_region
118 void update_alloc_region(HeapRegion* alloc_region);
119
113 // Allocate a new active region and use it to perform a word_size 120 // Allocate a new active region and use it to perform a word_size
114 // allocation. The force parameter will be passed on to 121 // allocation. The force parameter will be passed on to
115 // G1CollectedHeap::allocate_new_alloc_region() and tells it to try 122 // G1CollectedHeap::allocate_new_alloc_region() and tells it to try
116 // to allocate a new region even if the max has been reached. 123 // to allocate a new region even if the max has been reached.
117 HeapWord* new_alloc_region_and_allocate(size_t word_size, bool force); 124 HeapWord* new_alloc_region_and_allocate(size_t word_size, bool force);
134 HeapRegion* get() const { 141 HeapRegion* get() const {
135 HeapRegion * hr = _alloc_region; 142 HeapRegion * hr = _alloc_region;
136 // Make sure that the dummy region does not escape this class. 143 // Make sure that the dummy region does not escape this class.
137 return (hr == _dummy_region) ? NULL : hr; 144 return (hr == _dummy_region) ? NULL : hr;
138 } 145 }
146
147 void set_allocation_context(AllocationContext_t context) { _allocation_context = context; }
148 AllocationContext_t allocation_context() { return _allocation_context; }
139 149
140 uint count() { return _count; } 150 uint count() { return _count; }
141 151
142 // The following two are the building blocks for the allocation method. 152 // The following two are the building blocks for the allocation method.
143 153
180 #else // G1_ALLOC_REGION_TRACING 190 #else // G1_ALLOC_REGION_TRACING
181 void trace(const char* str, size_t word_size = 0, HeapWord* result = NULL) { } 191 void trace(const char* str, size_t word_size = 0, HeapWord* result = NULL) { }
182 #endif // G1_ALLOC_REGION_TRACING 192 #endif // G1_ALLOC_REGION_TRACING
183 }; 193 };
184 194
195 class MutatorAllocRegion : public G1AllocRegion {
196 protected:
197 virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
198 virtual void retire_region(HeapRegion* alloc_region, size_t allocated_bytes);
199 public:
200 MutatorAllocRegion()
201 : G1AllocRegion("Mutator Alloc Region", false /* bot_updates */) { }
202 };
203
204 class SurvivorGCAllocRegion : public G1AllocRegion {
205 protected:
206 virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
207 virtual void retire_region(HeapRegion* alloc_region, size_t allocated_bytes);
208 public:
209 SurvivorGCAllocRegion()
210 : G1AllocRegion("Survivor GC Alloc Region", false /* bot_updates */) { }
211 };
212
213 class OldGCAllocRegion : public G1AllocRegion {
214 protected:
215 virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
216 virtual void retire_region(HeapRegion* alloc_region, size_t allocated_bytes);
217 public:
218 OldGCAllocRegion()
219 : G1AllocRegion("Old GC Alloc Region", true /* bot_updates */) { }
220
221 // This specialization of release() makes sure that the last card that has
222 // been allocated into has been completely filled by a dummy object. This
223 // avoids races when remembered set scanning wants to update the BOT of the
224 // last card in the retained old gc alloc region, and allocation threads
225 // allocating into that card at the same time.
226 virtual HeapRegion* release();
227 };
228
185 class ar_ext_msg : public err_msg { 229 class ar_ext_msg : public err_msg {
186 public: 230 public:
187 ar_ext_msg(G1AllocRegion* alloc_region, const char *message) : err_msg("%s", "") { 231 ar_ext_msg(G1AllocRegion* alloc_region, const char *message) : err_msg("%s", "") {
188 alloc_region->fill_in_ext_msg(this, message); 232 alloc_region->fill_in_ext_msg(this, message);
189 } 233 }