1 /* 2 * Copyright (c) 2018, 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_SHENANDOAHTRAVERSALGC_HPP 25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_HPP 26 27 #include "memory/allocation.hpp" 28 #include "gc/shenandoah/shenandoahHeapRegionSet.hpp" 29 #include "gc/shenandoah/shenandoahTaskqueue.hpp" 30 #include "gc/shenandoah/shenandoahArrayCopyTaskQueue.hpp" 31 32 class Thread; 33 class ShenandoahHeapRegionSet; 34 class ShenandoahHeap; 35 class ShenandoahStrDedupQueue; 36 37 class ShenandoahTraversalGC : public CHeapObj<mtGC> { 38 private: 39 ShenandoahHeap* _heap; 40 ShenandoahObjToScanQueueSet* _task_queues; 41 42 // Used for buffering per-region liveness data. 43 // Needed since ShenandoahHeapRegion uses atomics to update liveness. 44 // 45 // The array has max-workers elements, each of which is an array of 46 // jushort * max_regions. The choice of jushort is not accidental: 47 // there is a tradeoff between static/dynamic footprint that translates 48 // into cache pressure (which is already high during marking), and 49 // too many atomic updates. size_t/jint is too large, jbyte is too small. 50 jushort** _liveness_local; 51 52 ShenandoahHeapRegionSet* const _traversal_set; 53 ShenandoahHeapRegionSet* const _root_regions; 54 55 ShenandoahHeapRegionSetIterator _root_regions_iterator; 56 57 ShenandoahConnectionMatrix* const _matrix; 58 59 ShenandoahArrayCopyTaskQueue _arraycopy_task_queue; 60 61 public: 62 ShenandoahTraversalGC(ShenandoahHeap* heap, size_t num_regions); 63 ~ShenandoahTraversalGC(); 64 65 ShenandoahHeapRegionSet* const traversal_set() const { return _traversal_set; } 66 ShenandoahHeapRegionSet* const root_regions() const { return _root_regions;} 67 68 void reset(); 69 void prepare(); 70 void init_traversal_collection(); 71 void concurrent_traversal_collection(); 72 void final_traversal_collection(); 73 74 template <class T, bool STRING_DEDUP, bool DEGEN, bool UPDATE_MATRIX> 75 inline void process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, oop base_obj, ShenandoahStrDedupQueue* dq = NULL); 76 77 bool check_and_handle_cancelled_gc(ParallelTaskTerminator* terminator); 78 79 ShenandoahObjToScanQueueSet* task_queues(); 80 81 jushort* get_liveness(uint worker_id); 82 void flush_liveness(uint worker_id); 83 84 void main_loop(uint worker_id, ParallelTaskTerminator* terminator); 85 86 void push_arraycopy(HeapWord* start, size_t count); 87 88 private: 89 90 void prepare_regions(); 91 92 template <class T> 93 void main_loop_work(T* cl, jushort* live_data, uint worker_id, ParallelTaskTerminator* terminator); 94 95 void preclean_weak_refs(); 96 void weak_refs_work(); 97 void weak_refs_work_doit(); 98 99 void fixup_roots(); 100 101 template <class T> 102 bool process_arraycopy_task(T* cl); 103 }; 104 105 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_HPP