41 class ShenandoahControlThread; |
41 class ShenandoahControlThread; |
42 class ShenandoahGCSession; |
42 class ShenandoahGCSession; |
43 class ShenandoahGCStateResetter; |
43 class ShenandoahGCStateResetter; |
44 class ShenandoahHeuristics; |
44 class ShenandoahHeuristics; |
45 class ShenandoahMarkingContext; |
45 class ShenandoahMarkingContext; |
|
46 class ShenandoahMode; |
46 class ShenandoahPhaseTimings; |
47 class ShenandoahPhaseTimings; |
47 class ShenandoahHeap; |
48 class ShenandoahHeap; |
48 class ShenandoahHeapRegion; |
49 class ShenandoahHeapRegion; |
49 class ShenandoahHeapRegionClosure; |
50 class ShenandoahHeapRegionClosure; |
50 class ShenandoahCollectionSet; |
51 class ShenandoahCollectionSet; |
211 size_t _num_regions; |
212 size_t _num_regions; |
212 ShenandoahHeapRegion** _regions; |
213 ShenandoahHeapRegion** _regions; |
213 ShenandoahRegionIterator _update_refs_iterator; |
214 ShenandoahRegionIterator _update_refs_iterator; |
214 |
215 |
215 public: |
216 public: |
|
217 |
|
218 inline HeapWord* base() const { return _heap_region.start(); } |
|
219 |
216 inline size_t num_regions() const { return _num_regions; } |
220 inline size_t num_regions() const { return _num_regions; } |
217 inline bool is_heap_region_special() { return _heap_region_special; } |
221 inline bool is_heap_region_special() { return _heap_region_special; } |
218 |
222 |
219 inline ShenandoahHeapRegion* const heap_region_containing(const void* addr) const; |
223 inline ShenandoahHeapRegion* const heap_region_containing(const void* addr) const; |
220 inline size_t heap_region_index_containing(const void* addr) const; |
224 inline size_t heap_region_index_containing(const void* addr) const; |
389 // Entry methods to normally concurrent GC operations. These set up logging, monitoring |
393 // Entry methods to normally concurrent GC operations. These set up logging, monitoring |
390 // for concurrent operation. |
394 // for concurrent operation. |
391 void entry_reset(); |
395 void entry_reset(); |
392 void entry_mark(); |
396 void entry_mark(); |
393 void entry_preclean(); |
397 void entry_preclean(); |
|
398 void entry_roots(); |
394 void entry_cleanup(); |
399 void entry_cleanup(); |
395 void entry_evac(); |
400 void entry_evac(); |
396 void entry_updaterefs(); |
401 void entry_updaterefs(); |
397 void entry_traversal(); |
402 void entry_traversal(); |
398 void entry_uncommit(double shrink_before); |
403 void entry_uncommit(double shrink_before); |
431 // ---------- GC subsystems |
437 // ---------- GC subsystems |
432 // |
438 // |
433 private: |
439 private: |
434 ShenandoahControlThread* _control_thread; |
440 ShenandoahControlThread* _control_thread; |
435 ShenandoahCollectorPolicy* _shenandoah_policy; |
441 ShenandoahCollectorPolicy* _shenandoah_policy; |
|
442 ShenandoahMode* _gc_mode; |
436 ShenandoahHeuristics* _heuristics; |
443 ShenandoahHeuristics* _heuristics; |
437 ShenandoahFreeSet* _free_set; |
444 ShenandoahFreeSet* _free_set; |
438 ShenandoahConcurrentMark* _scm; |
445 ShenandoahConcurrentMark* _scm; |
439 ShenandoahTraversalGC* _traversal_gc; |
446 ShenandoahTraversalGC* _traversal_gc; |
440 ShenandoahMarkCompact* _full_gc; |
447 ShenandoahMarkCompact* _full_gc; |
450 public: |
457 public: |
451 ShenandoahCollectorPolicy* shenandoah_policy() const { return _shenandoah_policy; } |
458 ShenandoahCollectorPolicy* shenandoah_policy() const { return _shenandoah_policy; } |
452 ShenandoahHeuristics* heuristics() const { return _heuristics; } |
459 ShenandoahHeuristics* heuristics() const { return _heuristics; } |
453 ShenandoahFreeSet* free_set() const { return _free_set; } |
460 ShenandoahFreeSet* free_set() const { return _free_set; } |
454 ShenandoahConcurrentMark* concurrent_mark() { return _scm; } |
461 ShenandoahConcurrentMark* concurrent_mark() { return _scm; } |
455 ShenandoahTraversalGC* traversal_gc() { return _traversal_gc; } |
462 ShenandoahTraversalGC* traversal_gc() const { return _traversal_gc; } |
|
463 bool is_traversal_mode() const { return _traversal_gc != NULL; } |
456 ShenandoahPacer* pacer() const { return _pacer; } |
464 ShenandoahPacer* pacer() const { return _pacer; } |
457 |
465 |
458 ShenandoahPhaseTimings* phase_timings() const { return _phase_timings; } |
466 ShenandoahPhaseTimings* phase_timings() const { return _phase_timings; } |
459 ShenandoahAllocTracker* alloc_tracker() const { return _alloc_tracker; } |
467 ShenandoahAllocTracker* alloc_tracker() const { return _alloc_tracker; } |
460 |
468 |
505 |
513 |
506 public: |
514 public: |
507 void set_unload_classes(bool uc); |
515 void set_unload_classes(bool uc); |
508 bool unload_classes() const; |
516 bool unload_classes() const; |
509 |
517 |
510 // Delete entries for dead interned string and clean up unreferenced symbols |
518 // Perform STW class unloading and weak root cleaning |
511 // in symbol table, possibly in parallel. |
519 void parallel_cleaning(bool full_gc); |
512 void unload_classes_and_cleanup_tables(bool full_gc); |
520 |
|
521 private: |
|
522 void stw_unload_classes(bool full_gc); |
|
523 void stw_process_weak_roots(bool full_gc); |
513 |
524 |
514 // ---------- Generic interface hooks |
525 // ---------- Generic interface hooks |
515 // Minor things that super-interface expects us to implement to play nice with |
526 // Minor things that super-interface expects us to implement to play nice with |
516 // the rest of runtime. Some of the things here are not required to be implemented, |
527 // the rest of runtime. Some of the things here are not required to be implemented, |
517 // and can be stubbed out. |
528 // and can be stubbed out. |
520 AdaptiveSizePolicy* size_policy() shenandoah_not_implemented_return(NULL); |
531 AdaptiveSizePolicy* size_policy() shenandoah_not_implemented_return(NULL); |
521 bool is_maximal_no_gc() const shenandoah_not_implemented_return(false); |
532 bool is_maximal_no_gc() const shenandoah_not_implemented_return(false); |
522 |
533 |
523 bool is_in(const void* p) const; |
534 bool is_in(const void* p) const; |
524 |
535 |
|
536 MemRegion reserved_region() const { return _reserved; } |
|
537 bool is_in_reserved(const void* addr) const { return _reserved.contains(addr); } |
|
538 |
525 void collect(GCCause::Cause cause); |
539 void collect(GCCause::Cause cause); |
526 void do_full_collection(bool clear_all_soft_refs); |
540 void do_full_collection(bool clear_all_soft_refs); |
527 |
541 |
528 // Used for parsing heap during error printing |
542 // Used for parsing heap during error printing |
529 HeapWord* block_start(const void* addr) const; |
543 HeapWord* block_start(const void* addr) const; |
530 bool block_is_obj(const HeapWord* addr) const; |
544 bool block_is_obj(const HeapWord* addr) const; |
|
545 bool print_location(outputStream* st, void* addr) const; |
531 |
546 |
532 // Used for native heap walkers: heap dumpers, mostly |
547 // Used for native heap walkers: heap dumpers, mostly |
533 void object_iterate(ObjectClosure* cl); |
548 void object_iterate(ObjectClosure* cl); |
534 void safe_object_iterate(ObjectClosure* cl); |
549 void safe_object_iterate(ObjectClosure* cl); |
535 |
550 |
688 inline oop maybe_update_with_forwarded_not_null(T* p, oop obj); |
703 inline oop maybe_update_with_forwarded_not_null(T* p, oop obj); |
689 |
704 |
690 template <class T> |
705 template <class T> |
691 inline oop update_with_forwarded_not_null(T* p, oop obj); |
706 inline oop update_with_forwarded_not_null(T* p, oop obj); |
692 |
707 |
693 inline oop atomic_compare_exchange_oop(oop n, narrowOop* addr, oop c); |
708 static inline oop cas_oop(oop n, narrowOop* addr, oop c); |
694 inline oop atomic_compare_exchange_oop(oop n, oop* addr, oop c); |
709 static inline oop cas_oop(oop n, oop* addr, oop c); |
|
710 static inline oop cas_oop(oop n, narrowOop* addr, narrowOop c); |
695 |
711 |
696 void trash_humongous_region_at(ShenandoahHeapRegion *r); |
712 void trash_humongous_region_at(ShenandoahHeapRegion *r); |
697 |
713 |
698 void deduplicate_string(oop str); |
714 void deduplicate_string(oop str); |
699 |
715 |