1 /* 2 * Copyright (c) 2013, 2015, Red Hat, Inc. and/or its affiliates. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. 7 * 8 * This code is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 * version 2 for more details (a copy is included in the LICENSE file that 12 * accompanied this code). 13 * 14 * You should have received a copy of the GNU General Public License version 15 * 2 along with this work; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 19 * or visit www.oracle.com if you need additional information or have any 20 * questions. 21 * 22 */ 23 24 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP 25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP 26 27 #include "gc/shared/cmBitMap.hpp" 28 29 class ConcurrentGCTimer; 30 31 class ShenandoahCollectorPolicy; 32 class ShenandoahHeapRegion; 33 class ShenandoahHeapRegionClosure; 34 class ShenandoahHeapRegionSet; 35 class ShenandoahCollectionSet; 36 class ShenandoahFreeSet; 37 class ShenandoahConcurrentMark; 38 class ShenandoahConcurrentThread; 39 class ShenandoahMonitoringSupport; 40 41 class ShenandoahAlwaysTrueClosure : public BoolObjectClosure { 42 public: 43 bool do_object_b(oop p) { return true; } 44 }; 45 46 47 class ShenandoahIsAliveClosure: public BoolObjectClosure { 48 private: 49 ShenandoahHeap* _heap; 50 public: 51 ShenandoahIsAliveClosure(); 52 void init(ShenandoahHeap* heap); 53 bool do_object_b(oop obj); 54 }; 55 56 class ShenandoahForwardedIsAliveClosure: public BoolObjectClosure { 57 private: 58 ShenandoahHeap* _heap; 59 public: 60 ShenandoahForwardedIsAliveClosure(); 61 void init(ShenandoahHeap* heap); 62 bool do_object_b(oop obj); 63 }; 64 65 66 // // A "ShenandoahHeap" is an implementation of a java heap for HotSpot. 67 // // It uses a new pauseless GC algorithm based on Brooks pointers. 68 // // Derived from G1 69 70 // // 71 // // CollectedHeap 72 // // SharedHeap 73 // // ShenandoahHeap 74 75 class ShenandoahHeap : public CollectedHeap { 76 77 private: 78 79 static ShenandoahHeap* _pgc; 80 ShenandoahCollectorPolicy* _shenandoah_policy; 81 VirtualSpace _storage; 82 ShenandoahHeapRegion* _first_region; 83 HeapWord* _first_region_bottom; 84 85 // Sortable array of regions 86 ShenandoahHeapRegionSet* _ordered_regions; 87 ShenandoahHeapRegionSet* _sorted_regions; 88 ShenandoahFreeSet* _free_regions; 89 ShenandoahCollectionSet* _collection_set; 90 ShenandoahHeapRegion* _currentAllocationRegion; 91 ShenandoahConcurrentMark* _scm; 92 93 94 95 ShenandoahConcurrentThread* _concurrent_gc_thread; 96 97 ShenandoahMonitoringSupport* _monitoring_support; 98 99 size_t _num_regions; 100 size_t _max_regions; 101 size_t _initialSize; 102 #ifndef NDEBUG 103 uint _numAllocs; 104 #endif 105 uint _max_parallel_workers; 106 uint _max_conc_workers; 107 uint _max_workers; 108 109 WorkGang* _conc_workers; 110 WorkGang* _workers; 111 112 113 volatile size_t _used; 114 115 CMBitMap _mark_bit_map0; 116 CMBitMap _mark_bit_map1; 117 CMBitMap* _prev_mark_bit_map; 118 CMBitMap* _next_mark_bit_map; 119 120 bool* _in_cset_fast_test; 121 bool* _in_cset_fast_test_base; 122 size_t _in_cset_fast_test_length; 123 124 HeapWord** _top_at_mark_starts; 125 HeapWord** _top_at_mark_starts_base; 126 127 volatile jbyte _cancelled_concgc; 128 129 jbyte _growing_heap; 130 131 size_t _bytes_allocated_since_cm; 132 size_t _bytes_allocated_during_cm; 133 size_t _bytes_allocated_during_cm_start; 134 size_t _max_allocated_gc; 135 size_t _allocated_last_gc; 136 size_t _used_start_gc; 137 138 unsigned int _concurrent_mark_in_progress; 139 140 bool _full_gc_in_progress; 141 142 unsigned int _evacuation_in_progress; 143 bool _need_update_refs; 144 bool _need_reset_bitmaps; 145 146 ReferenceProcessor* _ref_processor; 147 148 ShenandoahForwardedIsAliveClosure isAlive; 149 150 ConcurrentGCTimer* _gc_timer; 151 152 public: 153 ShenandoahHeap(ShenandoahCollectorPolicy* policy); 154 155 HeapWord *first_region_bottom() { return _first_region_bottom; } 156 157 const char* name() const /* override */; 158 HeapWord* allocate_new_tlab(size_t word_size) /* override */; 159 void print_on(outputStream* st) const /* override */; 160 161 ShenandoahHeap::Name kind() const /* override */{ 162 return CollectedHeap::ShenandoahHeap; 163 } 164 165 jint initialize() /* override */; 166 void post_initialize() /* override */; 167 size_t capacity() const /* override */; 168 size_t used() const /* override */; 169 bool is_maximal_no_gc() const /* override */; 170 size_t max_capacity() const /* override */; 171 size_t min_capacity() const /* override */; 172 bool is_in(const void* p) const /* override */; 173 bool is_scavengable(const void* addr) /* override */; 174 HeapWord* mem_allocate(size_t size, bool* what) /* override */; 175 bool can_elide_tlab_store_barriers() const /* override */; 176 oop new_store_pre_barrier(JavaThread* thread, oop new_obj) /* override */; 177 bool can_elide_initializing_store_barrier(oop new_obj) /* override */; 178 bool card_mark_must_follow_store() const /* override */; 179 void collect(GCCause::Cause) /* override */; 180 void do_full_collection(bool clear_all_soft_refs) /* override */; 181 AdaptiveSizePolicy* size_policy() /* override */; 182 CollectorPolicy* collector_policy() const /* override */; 183 void ensure_parsability(bool retire_tlabs) /* override */; 184 HeapWord* block_start(const void* addr) const /* override */; 185 size_t block_size(const HeapWord* addr) const /* override */; 186 bool block_is_obj(const HeapWord* addr) const /* override */; 187 jlong millis_since_last_gc() /* override */; 188 void prepare_for_verify() /* override */; 189 void print_gc_threads_on(outputStream* st) const /* override */; 190 void gc_threads_do(ThreadClosure* tcl) const /* override */; 191 void print_tracing_info() const /* override */; 192 void verify(VerifyOption vo) /* override */; 193 bool supports_tlab_allocation() const /* override */; 194 size_t tlab_capacity(Thread *thr) const /* override */; 195 void object_iterate(ObjectClosure* cl) /* override */; 196 void safe_object_iterate(ObjectClosure* cl) /* override */; 197 size_t unsafe_max_tlab_alloc(Thread *thread) const /* override */; 198 size_t max_tlab_size() const /* override */; 199 void resize_all_tlabs() /* override */; 200 void accumulate_statistics_all_gclabs() /* override */; 201 HeapWord* tlab_post_allocation_setup(HeapWord* obj) /* override */; 202 uint oop_extra_words() /* override */; 203 size_t tlab_used(Thread* ignored) const /* override */; 204 void stop() /* override */; 205 206 #ifndef CC_INTERP 207 void compile_prepare_oop(MacroAssembler* masm, Register obj) /* override */; 208 #endif 209 210 void register_nmethod(nmethod* nm); 211 void unregister_nmethod(nmethod* nm); 212 213 void pin_object(oop o) /* override */; 214 void unpin_object(oop o) /* override */; 215 216 static ShenandoahHeap* heap(); 217 static ShenandoahHeap* heap_no_check(); 218 static size_t conservative_max_heap_alignment(); 219 static address in_cset_fast_test_addr(); 220 static address cancelled_concgc_addr(); 221 222 static void pretouch_storage(char* start, char* end, WorkGang* workers); 223 224 ShenandoahCollectorPolicy *shenandoahPolicy() { return _shenandoah_policy;} 225 226 inline ShenandoahHeapRegion* heap_region_containing(const void* addr) const; 227 inline uint heap_region_index_containing(const void* addr) const; 228 inline bool requires_marking(const void* entry) const; 229 template <class T> 230 inline oop maybe_update_oop_ref(T* p); 231 232 void recycle_dirty_regions(); 233 234 void start_concurrent_marking(); 235 void stop_concurrent_marking(); 236 inline bool concurrent_mark_in_progress(); 237 static address concurrent_mark_in_progress_addr(); 238 239 void prepare_for_concurrent_evacuation(); 240 void evacuate_and_update_roots(); 241 inline bool is_evacuation_in_progress(); 242 void set_evacuation_in_progress(bool in_progress); 243 244 void set_full_gc_in_progress(bool in_progress); 245 bool is_full_gc_in_progress() const; 246 247 inline bool need_update_refs() const; 248 void set_need_update_refs(bool update_refs); 249 250 inline bool in_cset_fast_test(HeapWord* obj); 251 void clear_cset_fast_test(); 252 void register_region_with_in_cset_fast_test(ShenandoahHeapRegion* r); 253 254 inline bool allocated_after_mark_start(HeapWord* addr) const; 255 void set_top_at_mark_start(HeapWord* region_base, HeapWord* addr); 256 257 inline oop evacuate_object(oop src, Thread* thread); 258 inline bool cancelled_concgc() const; 259 void clear_cancelled_concgc(); 260 261 ShenandoahHeapRegionSet* regions() { return _ordered_regions;} 262 ShenandoahHeapRegionSet* sorted_regions() { return _sorted_regions;} 263 ShenandoahFreeSet* free_regions(); 264 void clear_free_regions(); 265 void add_free_region(ShenandoahHeapRegion* r); 266 267 void increase_used(size_t bytes); 268 void decrease_used(size_t bytes); 269 270 void set_used(size_t bytes); 271 size_t calculateUsed(); 272 273 void reset_mark_bitmap(WorkGang* gang); 274 void reset_prev_mark_bitmap(WorkGang* gang); 275 void reset_mark_bitmap_range(HeapWord* from, HeapWord* to); 276 void reset_prev_mark_bitmap_range(HeapWord* from, HeapWord* to); 277 CMBitMap* prev_mark_bit_map(); 278 CMBitMap* next_mark_bit_map(); 279 inline bool is_marked_prev(oop obj) const; 280 inline bool mark_current(oop obj) const; 281 inline bool is_marked_current(oop obj) const; 282 bool is_obj_dead(const oop obj, const ShenandoahHeapRegion* r) const; 283 bool is_bitmap_clear(); 284 285 void parallel_evacuate_region(ShenandoahHeapRegion* from_region); 286 287 template <class T> 288 inline oop update_oop_ref_not_null(T* p, oop obj); 289 290 void print_heap_regions(outputStream* st = tty) const; 291 void print_all_refs(const char* prefix); 292 void print_heap_locations(HeapWord* start, HeapWord* end); 293 294 size_t bytes_allocated_since_cm(); 295 void set_bytes_allocated_since_cm(size_t bytes); 296 297 size_t max_allocated_gc(); 298 299 void reclaim_humongous_region_at(ShenandoahHeapRegion* r); 300 301 VirtualSpace* storage() const; 302 303 ShenandoahMonitoringSupport* monitoring_support(); 304 ShenandoahConcurrentMark* concurrentMark() { return _scm;} 305 306 ReferenceProcessor* ref_processor() { return _ref_processor;} 307 308 WorkGang* conc_workers() const { return _conc_workers;} 309 WorkGang* workers() const { return _workers;} 310 311 uint max_conc_workers(); 312 uint max_workers(); 313 uint max_parallel_workers(); 314 315 void do_evacuation(); 316 ShenandoahHeapRegion* next_compaction_region(const ShenandoahHeapRegion* r); 317 318 void heap_region_iterate(ShenandoahHeapRegionClosure* blk, bool skip_dirty_regions = false, bool skip_humongous_continuation = false) const; 319 320 void verify_heap_after_evacuation(); 321 322 // Delete entries for dead interned string and clean up unreferenced symbols 323 // in symbol table, possibly in parallel. 324 void unlink_string_and_symbol_table(BoolObjectClosure* is_alive, bool unlink_strings = true, bool unlink_symbols = true); 325 326 size_t num_regions(); 327 size_t max_regions(); 328 329 // TODO: consider moving this into ShenandoahHeapRegion. 330 331 template<class T> 332 inline void marked_prev_object_iterate(ShenandoahHeapRegion* region, T* cl); 333 334 template<class T> 335 inline void marked_next_object_iterate(ShenandoahHeapRegion* region, T* cl); 336 337 GCTimer* gc_timer() const; 338 339 private: 340 HeapWord* allocate_new_tlab(size_t word_size, bool mark); 341 HeapWord* allocate_memory(size_t word_size, bool evacuating); 342 // Shenandoah functionality. 343 inline HeapWord* allocate_from_gclab(Thread* thread, size_t size); 344 HeapWord* allocate_from_gclab_slow(Thread* thread, size_t size); 345 HeapWord* allocate_new_gclab(size_t word_size); 346 347 void roots_iterate(OopClosure* cl); 348 349 template<class T> 350 inline void marked_object_iterate(ShenandoahHeapRegion* region, T* cl, CMBitMap* mark_bit_map, HeapWord* top_at_mark_start); 351 352 template<class T> 353 inline void do_marked_object(CMBitMap* bitmap, T* cl, oop obj); 354 355 ShenandoahConcurrentThread* concurrent_thread() { return _concurrent_gc_thread; } 356 357 void swap_mark_bitmaps(); 358 359 inline bool mark_current_no_checks(oop obj) const; 360 inline bool is_marked_current(oop obj, ShenandoahHeapRegion* r) const; 361 362 inline bool is_marked_prev(oop obj, const ShenandoahHeapRegion* r) const; 363 364 void parallel_evacuate(); 365 366 template <class T> 367 inline oop maybe_update_oop_ref_not_null(T* p, oop obj); 368 369 inline oop atomic_compare_exchange_oop(oop n, narrowOop* addr, oop c); 370 inline oop atomic_compare_exchange_oop(oop n, oop* addr, oop c); 371 372 void evacuate_region(ShenandoahHeapRegion* from_region, ShenandoahHeapRegion* to_region); 373 374 #ifdef ASSERT 375 void verify_evacuated_region(ShenandoahHeapRegion* from_region); 376 #endif 377 378 bool is_in_collection_set(const void* p); 379 380 inline void copy_object(oop p, HeapWord* s, size_t words); 381 void verify_copy(oop p, oop c); 382 void verify_heap_size_consistency(); 383 void verify_heap_after_marking(); 384 void verify_heap_after_update_refs(); 385 void verify_regions_after_update_refs(); 386 387 void ref_processing_init(); 388 389 GCTracer* tracer(); 390 ShenandoahCollectionSet* collection_set() { return _collection_set; } 391 392 bool call_from_write_barrier(bool evacuating); 393 bool check_grow_heap(); 394 void grow_heap_by(size_t num_regions); 395 void ensure_new_regions(size_t num_new_regions); 396 397 void verify_evacuation(ShenandoahHeapRegion* from_region); 398 void set_concurrent_mark_in_progress(bool in_progress); 399 400 void oom_during_evacuation(); 401 void cancel_concgc(); 402 inline void set_cancelled_concgc(bool v); 403 404 void verify_live(); 405 void verify_liveness_after_concurrent_mark(); 406 407 HeapWord* allocate_memory_work(size_t word_size); 408 HeapWord* allocate_large_memory(size_t word_size); 409 410 void set_from_region_protection(bool protect); 411 412 }; 413 414 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP