< prev index next >

src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp

Print this page

 82 
 83   if (StringDedup::is_enabled() &&
 84       java_lang_String::is_instance(obj) &&
 85       psStringDedup::is_candidate_from_mark(obj)) {
 86     _string_dedup_requests.add(obj);
 87   }
 88 
 89   ContinuationGCSupport::transform_stack_chunk(obj);
 90 
 91   _marking_stats_cache->push(obj, obj->size());
 92   marking_stack()->push(ScannerTask(obj));
 93 }
 94 
 95 inline void ParCompactionManager::FollowStackClosure::do_void() {
 96   _compaction_manager->follow_marking_stacks();
 97   if (_terminator != nullptr) {
 98     steal_marking_work(*_terminator, _worker_id);
 99   }
100 }
101 
102 template <typename T>
103 inline void follow_array_specialized(objArrayOop obj, size_t start, size_t end, ParCompactionManager* cm) {
104   assert(start <= end, "invariant");
105   T* const base = (T*)obj->base();
106   T* const beg = base + start;
107   T* const chunk_end = base + end;
108 
109   // Push the non-null elements of the next stride on the marking stack.
110   for (T* e = beg; e < chunk_end; e++) {
111     cm->mark_and_push<T>(e);
112   }
113 }
114 
115 inline void ParCompactionManager::follow_array(objArrayOop obj, size_t start, size_t end) {
116   if (UseCompressedOops) {
117     follow_array_specialized<narrowOop>(obj, start, end, this);
118   } else {
119     follow_array_specialized<oop>(obj, start, end, this);
120   }
121 }
122 
123 inline void ParCompactionManager::follow_contents(const ScannerTask& task, bool stolen) {
124   if (task.is_partial_array_state()) {
125     assert(PSParallelCompact::mark_bitmap()->is_marked(task.to_partial_array_state()->source()), "should be marked");
126     process_array_chunk(task.to_partial_array_state(), stolen);
127   } else {
128     oop obj = task.to_oop();
129     assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
130     if (obj->is_objArray()) {
131       push_objArray(obj);
132     } else {
133       obj->oop_iterate(&_mark_and_push_closure);
134     }
135   }
136 }
137 
138 inline void ParCompactionManager::MarkingStatsCache::push(size_t region_id, size_t live_words) {
139   size_t index = (region_id & entry_mask);
140   if (entries[index].region_id == region_id) {
141     // Hit
142     entries[index].live_words += live_words;
143     return;
144   }
145   // Miss
146   if (entries[index].live_words != 0) {
147     evict(index);
148   }
149   entries[index].region_id = region_id;
150   entries[index].live_words = live_words;
151 }

 82 
 83   if (StringDedup::is_enabled() &&
 84       java_lang_String::is_instance(obj) &&
 85       psStringDedup::is_candidate_from_mark(obj)) {
 86     _string_dedup_requests.add(obj);
 87   }
 88 
 89   ContinuationGCSupport::transform_stack_chunk(obj);
 90 
 91   _marking_stats_cache->push(obj, obj->size());
 92   marking_stack()->push(ScannerTask(obj));
 93 }
 94 
 95 inline void ParCompactionManager::FollowStackClosure::do_void() {
 96   _compaction_manager->follow_marking_stacks();
 97   if (_terminator != nullptr) {
 98     steal_marking_work(*_terminator, _worker_id);
 99   }
100 }
101 













102 inline void ParCompactionManager::follow_array(objArrayOop obj, size_t start, size_t end) {
103   obj->oop_iterate_elements_range(&_mark_and_push_closure,
104                                   checked_cast<int>(start),
105                                   checked_cast<int>(end));


106 }
107 
108 inline void ParCompactionManager::follow_contents(const ScannerTask& task, bool stolen) {
109   if (task.is_partial_array_state()) {
110     assert(PSParallelCompact::mark_bitmap()->is_marked(task.to_partial_array_state()->source()), "should be marked");
111     process_array_chunk(task.to_partial_array_state(), stolen);
112   } else {
113     oop obj = task.to_oop();
114     assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
115     if (obj->is_array_with_oops()) {
116       push_objArray((objArrayOop)obj);
117     } else {
118       obj->oop_iterate(&_mark_and_push_closure);
119     }
120   }
121 }
122 
123 inline void ParCompactionManager::MarkingStatsCache::push(size_t region_id, size_t live_words) {
124   size_t index = (region_id & entry_mask);
125   if (entries[index].region_id == region_id) {
126     // Hit
127     entries[index].live_words += live_words;
128     return;
129   }
130   // Miss
131   if (entries[index].live_words != 0) {
132     evict(index);
133   }
134   entries[index].region_id = region_id;
135   entries[index].live_words = live_words;
136 }
< prev index next >