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 ShenandoahForwardedIsAliveClosure: public BoolObjectClosure { 48 private: 49 ShenandoahHeap* _heap; 50 public: 51 ShenandoahForwardedIsAliveClosure(); 52 void init(ShenandoahHeap* heap); 53 bool do_object_b(oop obj); 54 }; 55 56 57 // // A "ShenandoahHeap" is an implementation of a java heap for HotSpot. 58 // // It uses a new pauseless GC algorithm based on Brooks pointers. 59 // // Derived from G1 60 61 // // 62 // // CollectedHeap 63 // // SharedHeap 64 // // ShenandoahHeap 65 66 class ShenandoahHeap : public CollectedHeap { 67 public: 68 enum ShenandoahCancelCause { 69 _oom_evacuation, 70 _vm_stop, 71 }; 72 private: 73 74 static ShenandoahHeap* _pgc; 75 ShenandoahCollectorPolicy* _shenandoah_policy; 76 VirtualSpace _storage; 77 ShenandoahHeapRegion* _first_region; 78 HeapWord* _first_region_bottom; 79 80 // Sortable array of regions 81 ShenandoahHeapRegionSet* _ordered_regions; 82 ShenandoahHeapRegionSet* _sorted_regions; 83 ShenandoahFreeSet* _free_regions; 84 ShenandoahCollectionSet* _collection_set; 85 ShenandoahHeapRegion* _currentAllocationRegion; 86 ShenandoahConcurrentMark* _scm; 87 88 89 90 ShenandoahConcurrentThread* _concurrent_gc_thread; 91 92 ShenandoahMonitoringSupport* _monitoring_support; 93 94 size_t _num_regions; 95 size_t _max_regions; 96 size_t _initialSize; 97 #ifndef NDEBUG 98 uint _numAllocs; 99 #endif 100 uint _max_parallel_workers; 101 uint _max_conc_workers; 102 uint _max_workers; 103 104 WorkGang* _conc_workers; 105 WorkGang* _workers; 106 107 108 volatile size_t _used; 109 110 CMBitMap _mark_bit_map0; 111 CMBitMap _mark_bit_map1; 112 CMBitMap* _complete_mark_bit_map; 113 CMBitMap* _next_mark_bit_map; 114 115 bool* _in_cset_fast_test; 116 bool* _in_cset_fast_test_base; 117 size_t _in_cset_fast_test_length; 118 119 HeapWord** _complete_top_at_mark_starts; 120 HeapWord** _complete_top_at_mark_starts_base; 121 122 HeapWord** _next_top_at_mark_starts; 123 HeapWord** _next_top_at_mark_starts_base; 124 125 volatile jbyte _cancelled_concgc; 126 127 jbyte _growing_heap; 128 129 size_t _bytes_allocated_since_cm; 130 size_t _bytes_allocated_during_cm; 131 size_t _bytes_allocated_during_cm_start; 132 size_t _max_allocated_gc; 133 size_t _allocated_last_gc; 134 size_t _used_start_gc; 135 136 unsigned int _concurrent_mark_in_progress; 137 138 bool _full_gc_in_progress; 139 140 unsigned int _evacuation_in_progress; 141 bool _need_update_refs; 142 bool _need_reset_bitmaps; 143 144 ReferenceProcessor* _ref_processor; 145 146 ShenandoahForwardedIsAliveClosure isAlive; 147 148 ConcurrentGCTimer* _gc_timer; 149 150 public: 151 ShenandoahHeap(ShenandoahCollectorPolicy* policy); 152 153 HeapWord *first_region_bottom() { return _first_region_bottom; } 154 155 const char* name() const /* override */; 156 HeapWord* allocate_new_tlab(size_t word_size) /* override */; 157 void print_on(outputStream* st) const /* override */; 158 159 ShenandoahHeap::Name kind() const /* override */{ 160 return CollectedHeap::ShenandoahHeap; 161 } 162 163 jint initialize() /* override */; 164 void post_initialize() /* override */; 165 size_t capacity() const /* override */; 166 size_t used() const /* override */; 167 bool is_maximal_no_gc() const /* override */; 168 size_t max_capacity() const /* override */; 169 size_t min_capacity() const /* override */; 170 bool is_in(const void* p) const /* override */; 171 bool is_scavengable(const void* addr) /* override */; 172 HeapWord* mem_allocate(size_t size, bool* what) /* override */; 173 bool can_elide_tlab_store_barriers() const /* override */; 174 oop new_store_pre_barrier(JavaThread* thread, oop new_obj) /* override */; 175 bool can_elide_initializing_store_barrier(oop new_obj) /* override */; 176 bool card_mark_must_follow_store() const /* override */; 177 void collect(GCCause::Cause) /* override */; 178 void do_full_collection(bool clear_all_soft_refs) /* override */; 179 AdaptiveSizePolicy* size_policy() /* override */; 180 CollectorPolicy* collector_policy() const /* override */; 181 void ensure_parsability(bool retire_tlabs) /* override */; 182 HeapWord* block_start(const void* addr) const /* override */; 183 size_t block_size(const HeapWord* addr) const /* override */; 184 bool block_is_obj(const HeapWord* addr) const /* override */; 185 jlong millis_since_last_gc() /* override */; 186 void prepare_for_verify() /* override */; 187 void print_gc_threads_on(outputStream* st) const /* override */; 188 void gc_threads_do(ThreadClosure* tcl) const /* override */; 189 void print_tracing_info() const /* override */; 190 void verify(VerifyOption vo) /* override */; 191 bool supports_tlab_allocation() const /* override */; 192 size_t tlab_capacity(Thread *thr) const /* override */; 193 void object_iterate(ObjectClosure* cl) /* override */; 194 void safe_object_iterate(ObjectClosure* cl) /* override */; 195 size_t unsafe_max_tlab_alloc(Thread *thread) const /* override */; 196 size_t max_tlab_size() const /* override */; 197 void resize_all_tlabs() /* override */; 198 void accumulate_statistics_all_gclabs() /* override */; 199 HeapWord* tlab_post_allocation_setup(HeapWord* obj) /* override */; 200 uint oop_extra_words() /* override */; 201 size_t tlab_used(Thread* ignored) const /* override */; 202 void stop() /* override */; 203 204 #ifndef CC_INTERP 205 void compile_prepare_oop(MacroAssembler* masm, Register obj) /* override */; 206 #endif 207 208 void register_nmethod(nmethod* nm); 209 void unregister_nmethod(nmethod* nm); 210 211 void pin_object(oop o) /* override */; 212 void unpin_object(oop o) /* override */; 213 214 static ShenandoahHeap* heap(); 215 static ShenandoahHeap* heap_no_check(); 216 static size_t conservative_max_heap_alignment(); 217 static address in_cset_fast_test_addr(); 218 static address cancelled_concgc_addr(); 219 220 static void pretouch_storage(char* start, char* end, WorkGang* workers); 221 222 ShenandoahCollectorPolicy *shenandoahPolicy() { return _shenandoah_policy;} 223 224 inline ShenandoahHeapRegion* heap_region_containing(const void* addr) const; 225 inline uint heap_region_index_containing(const void* addr) const; 226 inline bool requires_marking(const void* entry) const; 227 template <class T> 228 inline oop maybe_update_oop_ref(T* p); 229 230 void recycle_dirty_regions(); 231 232 void start_concurrent_marking(); 233 void stop_concurrent_marking(); 234 inline bool concurrent_mark_in_progress(); 235 static address concurrent_mark_in_progress_addr(); 236 237 void prepare_for_concurrent_evacuation(); 238 void evacuate_and_update_roots(); 239 inline bool is_evacuation_in_progress(); 240 void set_evacuation_in_progress(bool in_progress); 241 242 void set_full_gc_in_progress(bool in_progress); 243 bool is_full_gc_in_progress() const; 244 245 inline bool need_update_refs() const; 246 void set_need_update_refs(bool update_refs); 247 248 inline bool region_in_collection_set(size_t region_index) const; 249 250 void set_region_in_collection_set(size_t region_index, bool b); 251 252 // Mainly there to avoid accidentally calling the templated 253 // method below with ShenandoahHeapRegion* which would be *wrong*. 254 inline bool in_collection_set(ShenandoahHeapRegion* r) const; 255 256 template <class T> 257 inline bool in_collection_set(T obj) const; 258 259 void clear_cset_fast_test(); 260 261 inline bool allocated_after_next_mark_start(HeapWord* addr) const; 262 void set_next_top_at_mark_start(HeapWord* region_base, HeapWord* addr); 263 HeapWord* next_top_at_mark_start(HeapWord* region_base); 264 265 inline bool allocated_after_complete_mark_start(HeapWord* addr) const; 266 void set_complete_top_at_mark_start(HeapWord* region_base, HeapWord* addr); 267 HeapWord* complete_top_at_mark_start(HeapWord* region_base); 268 269 inline oop evacuate_object(oop src, Thread* thread); 270 inline bool cancelled_concgc() const; 271 inline bool try_cancel_concgc() const; 272 void clear_cancelled_concgc(); 273 274 ShenandoahHeapRegionSet* regions() { return _ordered_regions;} 275 ShenandoahHeapRegionSet* sorted_regions() { return _sorted_regions;} 276 ShenandoahFreeSet* free_regions(); 277 void clear_free_regions(); 278 void add_free_region(ShenandoahHeapRegion* r); 279 280 void increase_used(size_t bytes); 281 void decrease_used(size_t bytes); 282 283 void set_used(size_t bytes); 284 size_t calculateUsed(); 285 286 void reset_next_mark_bitmap(WorkGang* gang); 287 void reset_complete_mark_bitmap(WorkGang* gang); 288 289 CMBitMap* complete_mark_bit_map(); 290 CMBitMap* next_mark_bit_map(); 291 inline bool is_marked_complete(oop obj) const; 292 inline bool mark_next(oop obj) const; 293 inline bool is_marked_next(oop obj) const; 294 bool is_next_bitmap_clear(); 295 bool is_complete_bitmap_clear_range(HeapWord* start, HeapWord* end); 296 297 void parallel_evacuate_region(ShenandoahHeapRegion* from_region); 298 299 template <class T> 300 inline oop update_oop_ref_not_null(T* p, oop obj); 301 302 void print_heap_regions(outputStream* st = tty) const; 303 void print_all_refs(const char* prefix); 304 void print_heap_locations(HeapWord* start, HeapWord* end); 305 306 size_t bytes_allocated_since_cm(); 307 void set_bytes_allocated_since_cm(size_t bytes); 308 309 size_t max_allocated_gc(); 310 311 void reclaim_humongous_region_at(ShenandoahHeapRegion* r); 312 313 VirtualSpace* storage() const; 314 315 ShenandoahMonitoringSupport* monitoring_support(); 316 ShenandoahConcurrentMark* concurrentMark() { return _scm;} 317 318 ReferenceProcessor* ref_processor() { return _ref_processor;} 319 320 WorkGang* conc_workers() const { return _conc_workers;} 321 WorkGang* workers() const { return _workers;} 322 323 uint max_conc_workers(); 324 uint max_workers(); 325 uint max_parallel_workers(); 326 327 void do_evacuation(); 328 ShenandoahHeapRegion* next_compaction_region(const ShenandoahHeapRegion* r); 329 330 void heap_region_iterate(ShenandoahHeapRegionClosure* blk, bool skip_dirty_regions = false, bool skip_humongous_continuation = false) const; 331 332 void verify_heap_after_evacuation(); 333 334 // Delete entries for dead interned string and clean up unreferenced symbols 335 // in symbol table, possibly in parallel. 336 void unlink_string_and_symbol_table(BoolObjectClosure* is_alive, bool unlink_strings = true, bool unlink_symbols = true); 337 338 size_t num_regions(); 339 size_t max_regions(); 340 341 // TODO: consider moving this into ShenandoahHeapRegion. 342 343 template<class T> 344 inline void marked_object_iterate(ShenandoahHeapRegion* region, T* cl); 345 346 GCTimer* gc_timer() const; 347 348 void swap_mark_bitmaps(); 349 350 private: 351 HeapWord* allocate_new_tlab(size_t word_size, bool mark); 352 HeapWord* allocate_memory(size_t word_size, bool evacuating); 353 // Shenandoah functionality. 354 inline HeapWord* allocate_from_gclab(Thread* thread, size_t size); 355 HeapWord* allocate_from_gclab_slow(Thread* thread, size_t size); 356 HeapWord* allocate_new_gclab(size_t word_size); 357 358 void roots_iterate(OopClosure* cl); 359 360 template<class T> 361 inline void do_marked_object(CMBitMap* bitmap, T* cl, oop obj); 362 363 ShenandoahConcurrentThread* concurrent_thread() { return _concurrent_gc_thread; } 364 365 inline bool mark_next_no_checks(oop obj) const; 366 367 void parallel_evacuate(); 368 369 template <class T> 370 inline oop maybe_update_oop_ref_not_null(T* p, oop obj); 371 372 inline oop atomic_compare_exchange_oop(oop n, narrowOop* addr, oop c); 373 inline oop atomic_compare_exchange_oop(oop n, oop* addr, oop c); 374 375 void evacuate_region(ShenandoahHeapRegion* from_region, ShenandoahHeapRegion* to_region); 376 377 #ifdef ASSERT 378 void verify_evacuated_region(ShenandoahHeapRegion* from_region); 379 #endif 380 381 inline void copy_object(oop p, HeapWord* s, size_t words); 382 void verify_copy(oop p, oop c); 383 void verify_heap_size_consistency(); 384 void verify_heap_after_marking(); 385 void verify_heap_after_update_refs(); 386 void verify_regions_after_update_refs(); 387 388 void ref_processing_init(); 389 390 GCTracer* tracer(); 391 ShenandoahCollectionSet* collection_set() { return _collection_set; } 392 393 bool call_from_write_barrier(bool evacuating); 394 bool check_grow_heap(); 395 void grow_heap_by(size_t num_regions); 396 void ensure_new_regions(size_t num_new_regions); 397 398 void verify_evacuation(ShenandoahHeapRegion* from_region); 399 void set_concurrent_mark_in_progress(bool in_progress); 400 401 void oom_during_evacuation(); 402 void cancel_concgc(GCCause::Cause cause); 403 void cancel_concgc(ShenandoahCancelCause cause); 404 inline void set_cancelled_concgc(bool v); 405 406 void verify_live(); 407 void verify_liveness_after_concurrent_mark(); 408 409 HeapWord* allocate_memory_work(size_t word_size); 410 HeapWord* allocate_large_memory(size_t word_size); 411 412 void set_from_region_protection(bool protect); 413 414 const char* cancel_cause_to_string(ShenandoahCancelCause cause); 415 416 }; 417 418 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP