26 #define SHARE_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
27
28 #include "memory/allocation.hpp"
29 #include "memory/virtualspace.hpp"
30 #include "gc/shenandoah/shenandoahHeap.hpp"
31 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
32 #include "gc/shenandoah/shenandoahPadding.hpp"
33
34 class ShenandoahCollectionSet : public CHeapObj<mtGC> {
35 friend class ShenandoahHeap;
36 private:
37 size_t const _map_size;
38 size_t const _region_size_bytes_shift;
39 ReservedSpace _map_space;
40 char* const _cset_map;
41 // Bias cset map's base address for fast test if an oop is in cset
42 char* const _biased_cset_map;
43
44 ShenandoahHeap* const _heap;
45
46 size_t _garbage;
47 size_t _used;
48 size_t _region_count;
49
50 shenandoah_padding(0);
51 volatile size_t _current_index;
52 shenandoah_padding(1);
53
54 public:
55 ShenandoahCollectionSet(ShenandoahHeap* heap, ReservedSpace space, char* heap_base);
56
57 // Add region to collection set
58 void add_region(ShenandoahHeapRegion* r);
59
60 // MT version
61 ShenandoahHeapRegion* claim_next();
62
63 // Single-thread version
64 ShenandoahHeapRegion* next();
65
66 size_t count() const { return _region_count; }
67 bool is_empty() const { return _region_count == 0; }
68
69 void clear_current_index() {
70 _current_index = 0;
71 }
72
73 inline bool is_in(ShenandoahHeapRegion* r) const;
74 inline bool is_in(size_t region_idx) const;
75 inline bool is_in(oop obj) const;
76 inline bool is_in_loc(void* loc) const;
77
78 void print_on(outputStream* out) const;
79
80 size_t used() const { return _used; }
81 size_t garbage() const { return _garbage; }
82 void clear();
83
84 private:
85 char* map_address() const {
86 return _cset_map;
87 }
88 char* biased_map_address() const {
89 return _biased_cset_map;
90 }
91 };
92
93 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
|
26 #define SHARE_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
27
28 #include "memory/allocation.hpp"
29 #include "memory/virtualspace.hpp"
30 #include "gc/shenandoah/shenandoahHeap.hpp"
31 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
32 #include "gc/shenandoah/shenandoahPadding.hpp"
33
34 class ShenandoahCollectionSet : public CHeapObj<mtGC> {
35 friend class ShenandoahHeap;
36 private:
37 size_t const _map_size;
38 size_t const _region_size_bytes_shift;
39 ReservedSpace _map_space;
40 char* const _cset_map;
41 // Bias cset map's base address for fast test if an oop is in cset
42 char* const _biased_cset_map;
43
44 ShenandoahHeap* const _heap;
45
46 bool _has_old_regions;
47 size_t _garbage;
48 size_t _used;
49 size_t _region_count;
50 size_t _immediate_trash;
51
52 size_t _young_bytes_to_evacuate;
53 size_t _young_bytes_to_promote;
54 size_t _old_bytes_to_evacuate;
55
56 size_t _young_region_count;
57 size_t _old_region_count;
58
59 size_t _old_garbage; // How many bytes of old garbage are present in a mixed collection set?
60
61 bool* _preselected_regions; // Points to array identifying which tenure-age regions have been preselected
62 // for inclusion in collection set. This field is only valid during brief
63 // spans of time while collection set is being constructed.
64
65 shenandoah_padding(0);
66 volatile size_t _current_index;
67 shenandoah_padding(1);
68
69 public:
70 ShenandoahCollectionSet(ShenandoahHeap* heap, ReservedSpace space, char* heap_base);
71
72 // Add region to collection set
73 void add_region(ShenandoahHeapRegion* r);
74
75 // MT version
76 ShenandoahHeapRegion* claim_next();
77
78 // Single-thread version
79 ShenandoahHeapRegion* next();
80
81 size_t count() const { return _region_count; }
82 bool is_empty() const { return _region_count == 0; }
83
84 void clear_current_index() {
85 _current_index = 0;
86 }
87
88 inline bool is_in(ShenandoahHeapRegion* r) const;
89 inline bool is_in(size_t region_idx) const;
90 inline bool is_in(oop obj) const;
91 inline bool is_in_loc(void* loc) const;
92
93 void print_on(outputStream* out) const;
94
95 inline size_t get_immediate_trash();
96 inline void set_immediate_trash(size_t immediate_trash);
97
98 // This represents total amount of work to be performed by evacuation, including evacuations to young, to old,
99 // and promotions from young to old. This equals get_young_bytes_reserved_for_evacuation() plus
100 // get_old_bytes_reserved_for_evacuation().
101 inline size_t get_bytes_reserved_for_evacuation();
102
103 // It is not known how many of these bytes will be promoted.
104 inline size_t get_young_bytes_reserved_for_evacuation();
105
106 inline size_t get_old_bytes_reserved_for_evacuation();
107
108 inline size_t get_young_bytes_to_be_promoted();
109
110 inline size_t get_old_region_count();
111
112 inline size_t get_young_region_count();
113
114 inline size_t get_old_garbage();
115
116 void establish_preselected(bool *preselected) { _preselected_regions = preselected; }
117 void abandon_preselected() { _preselected_regions = nullptr; }
118 bool is_preselected(size_t region_idx) { return (_preselected_regions != nullptr) && _preselected_regions[region_idx]; }
119
120 bool has_old_regions() const { return _has_old_regions; }
121 size_t used() const { return _used; }
122
123 size_t garbage() const { return _garbage; }
124 void clear();
125
126 private:
127 char* map_address() const {
128 return _cset_map;
129 }
130 char* biased_map_address() const {
131 return _biased_cset_map;
132 }
133 };
134
135 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
|