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 }
|