28 #include "code/codeCache.hpp" |
28 #include "code/codeCache.hpp" |
29 #include "gc/shared/parallelCleaning.hpp" |
29 #include "gc/shared/parallelCleaning.hpp" |
30 #include "logging/log.hpp" |
30 #include "logging/log.hpp" |
31 #include "memory/resourceArea.hpp" |
31 #include "memory/resourceArea.hpp" |
32 #include "logging/log.hpp" |
32 #include "logging/log.hpp" |
33 #if INCLUDE_JVMCI |
|
34 #include "jvmci/jvmci.hpp" |
|
35 #endif |
|
36 |
33 |
37 StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive, |
34 StringDedupCleaningTask::StringDedupCleaningTask(BoolObjectClosure* is_alive, |
38 OopClosure* keep_alive, |
35 OopClosure* keep_alive, |
39 bool resize_table) : |
36 bool resize_table) : |
40 AbstractGangTask("String Dedup Cleaning"), |
37 AbstractGangTask("String Dedup Cleaning"), |
158 InstanceKlass* klass; |
155 InstanceKlass* klass; |
159 while ((klass = claim_next_klass()) != NULL) { |
156 while ((klass = claim_next_klass()) != NULL) { |
160 clean_klass(klass); |
157 clean_klass(klass); |
161 } |
158 } |
162 } |
159 } |
163 |
|
164 #if INCLUDE_JVMCI |
|
165 JVMCICleaningTask::JVMCICleaningTask() : |
|
166 _cleaning_claimed(0) { |
|
167 } |
|
168 |
|
169 bool JVMCICleaningTask::claim_cleaning_task() { |
|
170 if (_cleaning_claimed) { |
|
171 return false; |
|
172 } |
|
173 |
|
174 return Atomic::cmpxchg(1, &_cleaning_claimed, 0) == 0; |
|
175 } |
|
176 |
|
177 void JVMCICleaningTask::work(bool unloading_occurred) { |
|
178 // One worker will clean JVMCI metadata handles. |
|
179 if (unloading_occurred && EnableJVMCI && claim_cleaning_task()) { |
|
180 JVMCI::do_unloading(unloading_occurred); |
|
181 } |
|
182 } |
|
183 #endif // INCLUDE_JVMCI |
|
184 |
|
185 ParallelCleaningTask::ParallelCleaningTask(BoolObjectClosure* is_alive, |
|
186 uint num_workers, |
|
187 bool unloading_occurred, |
|
188 bool resize_dedup_table) : |
|
189 AbstractGangTask("Parallel Cleaning"), |
|
190 _unloading_occurred(unloading_occurred), |
|
191 _string_dedup_task(is_alive, NULL, resize_dedup_table), |
|
192 _code_cache_task(num_workers, is_alive, unloading_occurred), |
|
193 JVMCI_ONLY(_jvmci_cleaning_task() COMMA) |
|
194 _klass_cleaning_task() { |
|
195 } |
|
196 |
|
197 // The parallel work done by all worker threads. |
|
198 void ParallelCleaningTask::work(uint worker_id) { |
|
199 // Clean JVMCI metadata handles. |
|
200 // Execute this task first because it is serial task. |
|
201 JVMCI_ONLY(_jvmci_cleaning_task.work(_unloading_occurred);) |
|
202 |
|
203 // Do first pass of code cache cleaning. |
|
204 _code_cache_task.work(worker_id); |
|
205 |
|
206 // Clean the string dedup data structures. |
|
207 _string_dedup_task.work(worker_id); |
|
208 |
|
209 // Clean all klasses that were not unloaded. |
|
210 // The weak metadata in klass doesn't need to be |
|
211 // processed if there was no unloading. |
|
212 if (_unloading_occurred) { |
|
213 _klass_cleaning_task.work(); |
|
214 } |
|
215 } |
|