1 /* 2 * Copyright Amazon.com Inc. 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_VM_GC_SHENANDOAH_SHENANDOAHGENERATION_HPP 26 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHGENERATION_HPP 27 28 #include "memory/allocation.hpp" 29 #include "gc/shenandoah/heuristics/shenandoahSpaceInfo.hpp" 30 #include "gc/shenandoah/shenandoahAffiliation.hpp" 31 #include "gc/shenandoah/shenandoahGenerationType.hpp" 32 #include "gc/shenandoah/shenandoahLock.hpp" 33 #include "gc/shenandoah/shenandoahMarkingContext.hpp" 34 35 class ShenandoahCollectionSet; 36 class ShenandoahHeap; 37 class ShenandoahHeapRegion; 38 class ShenandoahHeapRegionClosure; 39 class ShenandoahHeuristics; 40 class ShenandoahMode; 41 class ShenandoahReferenceProcessor; 42 43 44 class ShenandoahGeneration : public CHeapObj<mtGC>, public ShenandoahSpaceInfo { 45 friend class VMStructs; 46 private: 47 ShenandoahGenerationType const _type; 48 49 // Marking task queues and completeness 50 ShenandoahObjToScanQueueSet* _task_queues; 51 ShenandoahSharedFlag _is_marking_complete; 52 53 ShenandoahReferenceProcessor* const _ref_processor; 54 55 volatile size_t _affiliated_region_count; 56 57 // How much free memory is left in the last region of humongous objects. 58 // This is _not_ included in used, but it _is_ deducted from available, 59 // which gives the heuristics a more accurate view of how much memory remains 60 // for allocation. This figure is also included the heap status logging. 61 // The units are bytes. The value is only changed on a safepoint or under the 62 // heap lock. 63 size_t _humongous_waste; 64 65 // Bytes reserved within this generation to hold evacuated objects from the collection set 66 size_t _evacuation_reserve; 67 68 protected: 69 // Usage 70 71 volatile size_t _used; 72 volatile size_t _bytes_allocated_since_gc_start; 73 size_t _max_capacity; 74 75 ShenandoahHeuristics* _heuristics; 76 77 private: 78 // Compute evacuation budgets prior to choosing collection set. 79 void compute_evacuation_budgets(ShenandoahHeap* heap); 80 81 // Adjust evacuation budgets after choosing collection set. 82 void adjust_evacuation_budgets(ShenandoahHeap* heap, 83 ShenandoahCollectionSet* collection_set); 84 85 // Preselect for possible inclusion into the collection set exactly the most 86 // garbage-dense regions, including those that satisfy criteria 1 & 2 below, 87 // and whose live bytes will fit within old_available budget: 88 // Criterion 1. region age >= tenuring threshold 89 // Criterion 2. region garbage percentage > ShenandoahOldGarbageThreshold 90 // 91 // Identifies regions eligible for promotion in place, 92 // being those of at least tenuring_threshold age that have lower garbage 93 // density. 94 // 95 // Updates promotion_potential and pad_for_promote_in_place fields 96 // of the heap. Returns bytes of live object memory in the preselected 97 // regions, which are marked in the preselected_regions() indicator 98 // array of the heap's collection set, which should be initialized 99 // to false. 100 size_t select_aged_regions(size_t old_available); 101 102 size_t available(size_t capacity) const; 103 104 public: 105 ShenandoahGeneration(ShenandoahGenerationType type, 106 uint max_workers, 107 size_t max_capacity); 108 ~ShenandoahGeneration(); 109 110 bool is_young() const { return _type == YOUNG; } 111 bool is_old() const { return _type == OLD; } 112 bool is_global() const { return _type == GLOBAL || _type == NON_GEN; } 113 114 // see description in field declaration 115 void set_evacuation_reserve(size_t new_val); 116 size_t get_evacuation_reserve() const; 117 void augment_evacuation_reserve(size_t increment); 118 119 inline ShenandoahGenerationType type() const { return _type; } 120 121 virtual ShenandoahHeuristics* heuristics() const { return _heuristics; } 122 123 ShenandoahReferenceProcessor* ref_processor() { return _ref_processor; } 124 125 virtual ShenandoahHeuristics* initialize_heuristics(ShenandoahMode* gc_mode); 126 127 size_t max_capacity() const override { return _max_capacity; } 128 virtual size_t used_regions() const; 129 virtual size_t used_regions_size() const; 130 virtual size_t free_unaffiliated_regions() const; 131 size_t used() const override { return Atomic::load(&_used); } 132 size_t available() const override; 133 size_t available_with_reserve() const; 134 size_t used_including_humongous_waste() const { 135 return used() + get_humongous_waste(); 136 } 137 138 // Returns the memory available based on the _soft_ max heap capacity (soft_max_heap - used). 139 // The soft max heap size may be adjusted lower than the max heap size to cause the trigger 140 // to believe it has less memory available than is _really_ available. Lowering the soft 141 // max heap size will cause the adaptive heuristic to run more frequent cycles. 142 size_t soft_available() const override; 143 144 size_t bytes_allocated_since_gc_start() const override; 145 void reset_bytes_allocated_since_gc_start(); 146 void increase_allocated(size_t bytes); 147 148 // These methods change the capacity of the generation by adding or subtracting the given number of bytes from the current 149 // capacity, returning the capacity of the generation following the change. 150 size_t increase_capacity(size_t increment); 151 size_t decrease_capacity(size_t decrement); 152 153 // Set the capacity of the generation, returning the value set 154 size_t set_capacity(size_t byte_size); 155 156 void log_status(const char* msg) const; 157 158 // Used directly by FullGC 159 template <bool FOR_CURRENT_CYCLE, bool FULL_GC = false> 160 void reset_mark_bitmap(); 161 162 // Used by concurrent and degenerated GC to reset remembered set. 163 void swap_card_tables(); 164 165 // Update the read cards with the state of the write table (write table is not cleared). 166 void merge_write_table(); 167 168 // Called before init mark, expected to prepare regions for marking. 169 virtual void prepare_gc(); 170 171 // Called during final mark, chooses collection set, rebuilds free set. 172 virtual void prepare_regions_and_collection_set(bool concurrent); 173 174 // Cancel marking (used by Full collect and when cancelling cycle). 175 virtual void cancel_marking(); 176 177 virtual bool contains(ShenandoahAffiliation affiliation) const = 0; 178 179 // Return true if this region is affiliated with this generation. 180 virtual bool contains(ShenandoahHeapRegion* region) const = 0; 181 182 // Return true if this object is affiliated with this generation. 183 virtual bool contains(oop obj) const = 0; 184 185 // Apply closure to all regions affiliated with this generation. 186 virtual void parallel_heap_region_iterate(ShenandoahHeapRegionClosure* cl) = 0; 187 188 // Apply closure to all regions affiliated with this generation (include free regions); 189 virtual void parallel_heap_region_iterate_free(ShenandoahHeapRegionClosure* cl); 190 191 // Apply closure to all regions affiliated with this generation (single threaded). 192 virtual void heap_region_iterate(ShenandoahHeapRegionClosure* cl) = 0; 193 194 // This is public to support cancellation of marking when a Full cycle is started. 195 virtual void set_concurrent_mark_in_progress(bool in_progress) = 0; 196 197 // Check the bitmap only for regions belong to this generation. 198 bool is_bitmap_clear(); 199 200 // We need to track the status of marking for different generations. 201 bool is_mark_complete() { return _is_marking_complete.is_set(); } 202 virtual void set_mark_complete(); 203 virtual void set_mark_incomplete(); 204 205 ShenandoahMarkingContext* complete_marking_context(); 206 207 // Task queues 208 ShenandoahObjToScanQueueSet* task_queues() const { return _task_queues; } 209 virtual void reserve_task_queues(uint workers); 210 virtual ShenandoahObjToScanQueueSet* old_gen_task_queues() const; 211 212 // Scan remembered set at start of concurrent young-gen marking. 213 void scan_remembered_set(bool is_concurrent); 214 215 // Return the updated value of affiliated_region_count 216 size_t increment_affiliated_region_count(); 217 218 // Return the updated value of affiliated_region_count 219 size_t decrement_affiliated_region_count(); 220 // Same as decrement_affiliated_region_count, but w/o the need to hold heap lock before being called. 221 size_t decrement_affiliated_region_count_without_lock(); 222 223 // Return the updated value of affiliated_region_count 224 size_t increase_affiliated_region_count(size_t delta); 225 226 // Return the updated value of affiliated_region_count 227 size_t decrease_affiliated_region_count(size_t delta); 228 229 void establish_usage(size_t num_regions, size_t num_bytes, size_t humongous_waste); 230 231 void increase_used(size_t bytes); 232 void decrease_used(size_t bytes); 233 234 void increase_humongous_waste(size_t bytes); 235 void decrease_humongous_waste(size_t bytes); 236 size_t get_humongous_waste() const { return _humongous_waste; } 237 238 virtual bool is_concurrent_mark_in_progress() = 0; 239 void confirm_heuristics_mode(); 240 241 virtual void record_success_concurrent(bool abbreviated); 242 }; 243 244 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHGENERATION_HPP