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_GC_SHENANDOAH_SHENANDOAHGENERATIONALFULLGC_HPP
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONALFULLGC_HPP
27
28 #include "gc/shared/preservedMarks.hpp"
29 #include "memory/iterator.hpp"
30 #include "oops/oop.inline.hpp"
31 #include "utilities/growableArray.hpp"
32
33 class ShenandoahHeap;
34 class ShenandoahHeapRegion;
35
36 class ShenandoahGenerationalFullGC {
37 public:
38 // Prepares the generational mode heap for a full collection.
39 static void prepare();
40
41 // Full GC may have compacted objects in the old generation, so we need to rebuild the card tables.
42 static void rebuild_remembered_set(ShenandoahHeap* heap);
43
44 // Records end of cycle for young and old and establishes size of live bytes in old
45 static void handle_completion(ShenandoahHeap* heap);
46
47 // Full GC may have promoted regions and may have temporarily violated constraints on the usage and
48 // capacity of the old generation. This method will balance the accounting of regions between the
49 // young and old generations. This is somewhat vestigial, but the outcome of this method is used
50 // when rebuilding the free sets.
51 static void balance_generations_after_gc(ShenandoahHeap* heap);
52
53 // This will compute the target size for the old generation. It will be expressed in terms of
54 // a region surplus and deficit, which will be redistributed accordingly after rebuilding the
55 // free set.
56 static void compute_balances();
57
58 // Rebuilding the free set may have resulted in regions being pulled in to the old generation
59 // evacuation reserve. For this reason, we must update the usage and capacity of the generations
60 // again. In the distant past, the free set did not know anything about generations, so we had
61 // a layer built above it to represent how much young/old memory was available. This layer is
62 // redundant and adds complexity. We would like to one day remove it. Until then, we must keep it
63 // synchronized with the free set's view of things.
64 static void balance_generations_after_rebuilding_free_set();
65
66 // Logs the number of live bytes marked in the old generation. This is _not_ the same
67 // value used as the baseline for the old generation _after_ the full gc is complete.
68 // The value reported in the logs does not include objects and regions that may be
69 // promoted during the full gc.
70 static void log_live_in_old(ShenandoahHeap* heap);
71
72 // This is used to tally the number, usage and space wasted by humongous objects for each generation.
73 static void account_for_region(ShenandoahHeapRegion* r, size_t ®ion_count, size_t ®ion_usage, size_t &humongous_waste);
74
75 // Regions which are scheduled for in-place promotion during evacuation temporarily
76 // have their top set to their end to prevent new objects from being allocated in them
77 // before they are promoted. If the full GC encounters such a region, it means the
78 // in-place promotion did not happen, and we must restore the original value of top.
79 static void restore_top_before_promote(ShenandoahHeap* heap);
80
81 // Pinned regions are not compacted, so they may still hold unmarked objects with
82 // references to reclaimed memory. Remembered set scanning will crash if it attempts
83 // to iterate the oops in these objects. This method fills in dead objects for pinned,
84 // old regions.
85 static void maybe_coalesce_and_fill_region(ShenandoahHeapRegion* r);
86 };
87
88 class ShenandoahPrepareForGenerationalCompactionObjectClosure : public ObjectClosure {
89 private:
90 PreservedMarks* const _preserved_marks;
91 ShenandoahGenerationalHeap* const _heap;
92
93 // _empty_regions is a thread-local list of heap regions that have been completely emptied by this worker thread's
94 // compaction efforts. The worker thread that drives these efforts adds compacted regions to this list if the
95 // region has not been compacted onto itself.
96 GrowableArray<ShenandoahHeapRegion*>& _empty_regions;
97 int _empty_regions_pos;
98 ShenandoahHeapRegion* _old_to_region;
99 ShenandoahHeapRegion* _young_to_region;
100 ShenandoahHeapRegion* _from_region;
101 ShenandoahAffiliation _from_affiliation;
102 HeapWord* _old_compact_point;
103 HeapWord* _young_compact_point;
104 uint _worker_id;
105
106 public:
107 ShenandoahPrepareForGenerationalCompactionObjectClosure(PreservedMarks* preserved_marks,
108 GrowableArray<ShenandoahHeapRegion*>& empty_regions,
109 ShenandoahHeapRegion* from_region, uint worker_id);
110
111 void set_from_region(ShenandoahHeapRegion* from_region);
112 void finish();
113 void finish_old_region();
114 void finish_young_region();
115 bool is_compact_same_region();
116 int empty_regions_pos() const { return _empty_regions_pos; }
117
118 void do_object(oop p) override;
119 };
120
121 #endif //SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONALFULLGC_HPP