98 assert(req != nullptr, "Should be available if dedup is enabled");
99
100 // Skip if already requested or dedup is forbidden.
101 // The overwhelming majority of Strings would be filtered here.
102 // These bits are also sticky, so older Strings would be filtered here too.
103 if (java_lang_String::deduplication_requested_or_forbidden(obj)) {
104 return;
105 }
106
107 // Accept deduplication request.
108 if (!java_lang_String::test_and_set_deduplication_requested(obj)) {
109 req->add(obj);
110 }
111 }
112
113 template <ShenandoahGenerationType GENERATION>
114 inline void ShenandoahMark::count_liveness(ShenandoahLiveData* live_data, oop obj, Klass* klass, uint worker_id) {
115 const ShenandoahHeap* const heap = ShenandoahHeap::heap();
116 const size_t region_idx = heap->heap_region_index_containing(obj);
117 ShenandoahHeapRegion* const region = heap->get_region(region_idx);
118 const size_t size = obj->size_given_klass(klass);
119
120 // Age census for objects in the young generation
121 if (GENERATION == YOUNG || (GENERATION == GLOBAL && region->is_young())) {
122 assert(heap->mode()->is_generational(), "Only if generational");
123 assert(region->is_young(), "Only for young objects");
124 const uint age = ShenandoahHeap::get_object_age(obj);
125 ShenandoahAgeCensus* const census = ShenandoahGenerationalHeap::heap()->age_census();
126 CENSUS_NOISE(census->add(age, region->age(), region->youth(), size, worker_id);)
127 NO_CENSUS_NOISE(census->add(age, region->age(), size, worker_id);)
128 }
129
130 if (!region->is_humongous_start()) {
131 assert(!region->is_humongous(), "Cannot have continuations here");
132 assert(region->is_affiliated(), "Do not count live data within Free Regular Region %zu", region_idx);
133 ShenandoahLiveData cur = live_data[region_idx];
134 size_t new_val = size + cur;
135 if (new_val >= SHENANDOAH_LIVEDATA_MAX) {
136 // overflow, flush to region data
137 region->increase_live_data_gc_words(new_val);
138 live_data[region_idx] = 0;
|
98 assert(req != nullptr, "Should be available if dedup is enabled");
99
100 // Skip if already requested or dedup is forbidden.
101 // The overwhelming majority of Strings would be filtered here.
102 // These bits are also sticky, so older Strings would be filtered here too.
103 if (java_lang_String::deduplication_requested_or_forbidden(obj)) {
104 return;
105 }
106
107 // Accept deduplication request.
108 if (!java_lang_String::test_and_set_deduplication_requested(obj)) {
109 req->add(obj);
110 }
111 }
112
113 template <ShenandoahGenerationType GENERATION>
114 inline void ShenandoahMark::count_liveness(ShenandoahLiveData* live_data, oop obj, Klass* klass, uint worker_id) {
115 const ShenandoahHeap* const heap = ShenandoahHeap::heap();
116 const size_t region_idx = heap->heap_region_index_containing(obj);
117 ShenandoahHeapRegion* const region = heap->get_region(region_idx);
118 const size_t size = obj->size_given_mark_and_klass(obj->mark(), klass);
119
120 // Age census for objects in the young generation
121 if (GENERATION == YOUNG || (GENERATION == GLOBAL && region->is_young())) {
122 assert(heap->mode()->is_generational(), "Only if generational");
123 assert(region->is_young(), "Only for young objects");
124 const uint age = ShenandoahHeap::get_object_age(obj);
125 ShenandoahAgeCensus* const census = ShenandoahGenerationalHeap::heap()->age_census();
126 CENSUS_NOISE(census->add(age, region->age(), region->youth(), size, worker_id);)
127 NO_CENSUS_NOISE(census->add(age, region->age(), size, worker_id);)
128 }
129
130 if (!region->is_humongous_start()) {
131 assert(!region->is_humongous(), "Cannot have continuations here");
132 assert(region->is_affiliated(), "Do not count live data within Free Regular Region %zu", region_idx);
133 ShenandoahLiveData cur = live_data[region_idx];
134 size_t new_val = size + cur;
135 if (new_val >= SHENANDOAH_LIVEDATA_MAX) {
136 // overflow, flush to region data
137 region->increase_live_data_gc_words(new_val);
138 live_data[region_idx] = 0;
|