1 /* 2 * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_GC_G1_G1FULLGCPREPARETASK_HPP 26 #define SHARE_GC_G1_G1FULLGCPREPARETASK_HPP 27 28 #include "gc/g1/g1FullGCTask.hpp" 29 #include "gc/g1/heapRegion.hpp" 30 #include "memory/allocation.hpp" 31 32 class G1CollectedHeap; 33 class G1CMBitMap; 34 class G1FullCollector; 35 class G1FullGCCompactionPoint; 36 class HeapRegion; 37 38 // Determines the regions in the heap that should be part of the compaction and 39 // distributes them among the compaction queues in round-robin fashion. 40 class G1DetermineCompactionQueueClosure : public HeapRegionClosure { 41 G1CollectedHeap* _g1h; 42 G1FullCollector* _collector; 43 uint _cur_worker; 44 45 inline void free_empty_humongous_region(HeapRegion* hr); 46 47 inline bool should_compact(HeapRegion* hr) const; 48 49 // Returns the current worker id to assign a compaction point to, and selects 50 // the next one round-robin style. 51 inline uint next_worker(); 52 53 inline G1FullGCCompactionPoint* next_compaction_point(); 54 55 inline void add_to_compaction_queue(HeapRegion* hr); 56 57 public: 58 G1DetermineCompactionQueueClosure(G1FullCollector* collector); 59 60 inline bool do_heap_region(HeapRegion* hr) override; 61 }; 62 63 class G1FullGCPrepareTask : public G1FullGCTask { 64 volatile bool _has_free_compaction_targets; 65 HeapRegionClaimer _hrclaimer; 66 67 void set_has_free_compaction_targets(); 68 69 public: 70 G1FullGCPrepareTask(G1FullCollector* collector); 71 void work(uint worker_id); 72 // After the Prepare phase, are there any unused (empty) regions (compaction 73 // targets) at the end of any compaction queues? 74 bool has_free_compaction_targets(); 75 76 private: 77 class G1CalculatePointersClosure : public HeapRegionClosure { 78 G1CollectedHeap* _g1h; 79 G1FullCollector* _collector; 80 G1CMBitMap* _bitmap; 81 G1FullGCCompactionPoint* _cp; 82 83 void prepare_for_compaction(HeapRegion* hr); 84 85 public: 86 G1CalculatePointersClosure(G1FullCollector* collector, 87 G1FullGCCompactionPoint* cp); 88 89 bool do_heap_region(HeapRegion* hr); 90 }; 91 92 class G1PrepareCompactLiveClosure : public StackObj { 93 G1FullGCCompactionPoint* _cp; 94 95 public: 96 G1PrepareCompactLiveClosure(G1FullGCCompactionPoint* cp); 97 size_t apply(oop object); 98 }; 99 }; 100 101 // Closure to re-prepare objects in the serial compaction point queue regions for 102 // serial compaction. 103 class G1SerialRePrepareClosure : public StackObj { 104 G1FullGCCompactionPoint* _cp; 105 HeapWord* _dense_prefix_top; 106 107 public: 108 G1SerialRePrepareClosure(G1FullGCCompactionPoint* hrcp, HeapWord* dense_prefix_top) : 109 _cp(hrcp), 110 _dense_prefix_top(dense_prefix_top) { } 111 112 inline size_t apply(oop obj); 113 }; 114 115 #endif // SHARE_GC_G1_G1FULLGCPREPARETASK_HPP