< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp

Print this page

 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;
< prev index next >