Mercurial > hg > truffle
comparison src/share/vm/memory/referenceProcessor.cpp @ 20804:7848fc12602b
Merge with jdk8u40-b25
author | Gilles Duboscq <gilles.m.duboscq@oracle.com> |
---|---|
date | Tue, 07 Apr 2015 14:58:49 +0200 |
parents | 52b4284cb496 c2844108a708 |
children | f01ebceea995 |
comparison
equal
deleted
inserted
replaced
20184:84105dcdb05b | 20804:7848fc12602b |
---|---|
116 } | 116 } |
117 _discoveredSoftRefs = &_discovered_refs[0]; | 117 _discoveredSoftRefs = &_discovered_refs[0]; |
118 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; | 118 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; |
119 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; | 119 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; |
120 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; | 120 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; |
121 _discoveredCleanerRefs = &_discoveredPhantomRefs[_max_num_q]; | |
121 | 122 |
122 // Initialize all entries to NULL | 123 // Initialize all entries to NULL |
123 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { | 124 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
124 _discovered_refs[i].set_head(NULL); | 125 _discovered_refs[i].set_head(NULL); |
125 _discovered_refs[i].set_length(0); | 126 _discovered_refs[i].set_length(0); |
188 ReferenceProcessorStats ReferenceProcessor::process_discovered_references( | 189 ReferenceProcessorStats ReferenceProcessor::process_discovered_references( |
189 BoolObjectClosure* is_alive, | 190 BoolObjectClosure* is_alive, |
190 OopClosure* keep_alive, | 191 OopClosure* keep_alive, |
191 VoidClosure* complete_gc, | 192 VoidClosure* complete_gc, |
192 AbstractRefProcTaskExecutor* task_executor, | 193 AbstractRefProcTaskExecutor* task_executor, |
193 GCTimer* gc_timer) { | 194 GCTimer* gc_timer, |
195 GCId gc_id) { | |
194 NOT_PRODUCT(verify_ok_to_handle_reflists()); | 196 NOT_PRODUCT(verify_ok_to_handle_reflists()); |
195 | 197 |
196 assert(!enqueuing_is_done(), "If here enqueuing should not be complete"); | 198 assert(!enqueuing_is_done(), "If here enqueuing should not be complete"); |
197 // Stop treating discovered references specially. | 199 // Stop treating discovered references specially. |
198 disable_discovery(); | 200 disable_discovery(); |
210 bool trace_time = PrintGCDetails && PrintReferenceGC; | 212 bool trace_time = PrintGCDetails && PrintReferenceGC; |
211 | 213 |
212 // Soft references | 214 // Soft references |
213 size_t soft_count = 0; | 215 size_t soft_count = 0; |
214 { | 216 { |
215 GCTraceTime tt("SoftReference", trace_time, false, gc_timer); | 217 GCTraceTime tt("SoftReference", trace_time, false, gc_timer, gc_id); |
216 soft_count = | 218 soft_count = |
217 process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true, | 219 process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true, |
218 is_alive, keep_alive, complete_gc, task_executor); | 220 is_alive, keep_alive, complete_gc, task_executor); |
219 } | 221 } |
220 | 222 |
221 update_soft_ref_master_clock(); | 223 update_soft_ref_master_clock(); |
222 | 224 |
223 // Weak references | 225 // Weak references |
224 size_t weak_count = 0; | 226 size_t weak_count = 0; |
225 { | 227 { |
226 GCTraceTime tt("WeakReference", trace_time, false, gc_timer); | 228 GCTraceTime tt("WeakReference", trace_time, false, gc_timer, gc_id); |
227 weak_count = | 229 weak_count = |
228 process_discovered_reflist(_discoveredWeakRefs, NULL, true, | 230 process_discovered_reflist(_discoveredWeakRefs, NULL, true, |
229 is_alive, keep_alive, complete_gc, task_executor); | 231 is_alive, keep_alive, complete_gc, task_executor); |
230 } | 232 } |
231 | 233 |
232 // Final references | 234 // Final references |
233 size_t final_count = 0; | 235 size_t final_count = 0; |
234 { | 236 { |
235 GCTraceTime tt("FinalReference", trace_time, false, gc_timer); | 237 GCTraceTime tt("FinalReference", trace_time, false, gc_timer, gc_id); |
236 final_count = | 238 final_count = |
237 process_discovered_reflist(_discoveredFinalRefs, NULL, false, | 239 process_discovered_reflist(_discoveredFinalRefs, NULL, false, |
238 is_alive, keep_alive, complete_gc, task_executor); | 240 is_alive, keep_alive, complete_gc, task_executor); |
239 } | 241 } |
240 | 242 |
241 // Phantom references | 243 // Phantom references |
242 size_t phantom_count = 0; | 244 size_t phantom_count = 0; |
243 { | 245 { |
244 GCTraceTime tt("PhantomReference", trace_time, false, gc_timer); | 246 GCTraceTime tt("PhantomReference", trace_time, false, gc_timer, gc_id); |
245 phantom_count = | 247 phantom_count = |
246 process_discovered_reflist(_discoveredPhantomRefs, NULL, false, | 248 process_discovered_reflist(_discoveredPhantomRefs, NULL, false, |
249 is_alive, keep_alive, complete_gc, task_executor); | |
250 | |
251 // Process cleaners, but include them in phantom statistics. We expect | |
252 // Cleaner references to be temporary, and don't want to deal with | |
253 // possible incompatibilities arising from making it more visible. | |
254 phantom_count += | |
255 process_discovered_reflist(_discoveredCleanerRefs, NULL, false, | |
247 is_alive, keep_alive, complete_gc, task_executor); | 256 is_alive, keep_alive, complete_gc, task_executor); |
248 } | 257 } |
249 | 258 |
250 // Weak global JNI references. It would make more sense (semantically) to | 259 // Weak global JNI references. It would make more sense (semantically) to |
251 // traverse these simultaneously with the regular weak references above, but | 260 // traverse these simultaneously with the regular weak references above, but |
252 // that is not how the JDK1.2 specification is. See #4126360. Native code can | 261 // that is not how the JDK1.2 specification is. See #4126360. Native code can |
253 // thus use JNI weak references to circumvent the phantom references and | 262 // thus use JNI weak references to circumvent the phantom references and |
254 // resurrect a "post-mortem" object. | 263 // resurrect a "post-mortem" object. |
255 { | 264 { |
256 GCTraceTime tt("JNI Weak Reference", trace_time, false, gc_timer); | 265 GCTraceTime tt("JNI Weak Reference", trace_time, false, gc_timer, gc_id); |
257 if (task_executor != NULL) { | 266 if (task_executor != NULL) { |
258 task_executor->set_single_threaded_mode(); | 267 task_executor->set_single_threaded_mode(); |
259 } | 268 } |
260 process_phaseJNI(is_alive, keep_alive, complete_gc); | 269 process_phaseJNI(is_alive, keep_alive, complete_gc); |
261 } | 270 } |
880 void ReferenceProcessor::balance_all_queues() { | 889 void ReferenceProcessor::balance_all_queues() { |
881 balance_queues(_discoveredSoftRefs); | 890 balance_queues(_discoveredSoftRefs); |
882 balance_queues(_discoveredWeakRefs); | 891 balance_queues(_discoveredWeakRefs); |
883 balance_queues(_discoveredFinalRefs); | 892 balance_queues(_discoveredFinalRefs); |
884 balance_queues(_discoveredPhantomRefs); | 893 balance_queues(_discoveredPhantomRefs); |
894 balance_queues(_discoveredCleanerRefs); | |
885 } | 895 } |
886 | 896 |
887 size_t | 897 size_t |
888 ReferenceProcessor::process_discovered_reflist( | 898 ReferenceProcessor::process_discovered_reflist( |
889 DiscoveredList refs_lists[], | 899 DiscoveredList refs_lists[], |
1038 case REF_FINAL: | 1048 case REF_FINAL: |
1039 list = &_discoveredFinalRefs[id]; | 1049 list = &_discoveredFinalRefs[id]; |
1040 break; | 1050 break; |
1041 case REF_PHANTOM: | 1051 case REF_PHANTOM: |
1042 list = &_discoveredPhantomRefs[id]; | 1052 list = &_discoveredPhantomRefs[id]; |
1053 break; | |
1054 case REF_CLEANER: | |
1055 list = &_discoveredCleanerRefs[id]; | |
1043 break; | 1056 break; |
1044 case REF_NONE: | 1057 case REF_NONE: |
1045 // we should not reach here if we are an InstanceRefKlass | 1058 // we should not reach here if we are an InstanceRefKlass |
1046 default: | 1059 default: |
1047 ShouldNotReachHere(); | 1060 ShouldNotReachHere(); |
1249 void ReferenceProcessor::preclean_discovered_references( | 1262 void ReferenceProcessor::preclean_discovered_references( |
1250 BoolObjectClosure* is_alive, | 1263 BoolObjectClosure* is_alive, |
1251 OopClosure* keep_alive, | 1264 OopClosure* keep_alive, |
1252 VoidClosure* complete_gc, | 1265 VoidClosure* complete_gc, |
1253 YieldClosure* yield, | 1266 YieldClosure* yield, |
1254 GCTimer* gc_timer) { | 1267 GCTimer* gc_timer, |
1268 GCId gc_id) { | |
1255 | 1269 |
1256 NOT_PRODUCT(verify_ok_to_handle_reflists()); | 1270 NOT_PRODUCT(verify_ok_to_handle_reflists()); |
1257 | 1271 |
1258 // Soft references | 1272 // Soft references |
1259 { | 1273 { |
1260 GCTraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC, | 1274 GCTraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC, |
1261 false, gc_timer); | 1275 false, gc_timer, gc_id); |
1262 for (uint i = 0; i < _max_num_q; i++) { | 1276 for (uint i = 0; i < _max_num_q; i++) { |
1263 if (yield->should_return()) { | 1277 if (yield->should_return()) { |
1264 return; | 1278 return; |
1265 } | 1279 } |
1266 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive, | 1280 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive, |
1269 } | 1283 } |
1270 | 1284 |
1271 // Weak references | 1285 // Weak references |
1272 { | 1286 { |
1273 GCTraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC, | 1287 GCTraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC, |
1274 false, gc_timer); | 1288 false, gc_timer, gc_id); |
1275 for (uint i = 0; i < _max_num_q; i++) { | 1289 for (uint i = 0; i < _max_num_q; i++) { |
1276 if (yield->should_return()) { | 1290 if (yield->should_return()) { |
1277 return; | 1291 return; |
1278 } | 1292 } |
1279 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive, | 1293 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive, |
1282 } | 1296 } |
1283 | 1297 |
1284 // Final references | 1298 // Final references |
1285 { | 1299 { |
1286 GCTraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC, | 1300 GCTraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC, |
1287 false, gc_timer); | 1301 false, gc_timer, gc_id); |
1288 for (uint i = 0; i < _max_num_q; i++) { | 1302 for (uint i = 0; i < _max_num_q; i++) { |
1289 if (yield->should_return()) { | 1303 if (yield->should_return()) { |
1290 return; | 1304 return; |
1291 } | 1305 } |
1292 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive, | 1306 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive, |
1295 } | 1309 } |
1296 | 1310 |
1297 // Phantom references | 1311 // Phantom references |
1298 { | 1312 { |
1299 GCTraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC, | 1313 GCTraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC, |
1300 false, gc_timer); | 1314 false, gc_timer, gc_id); |
1301 for (uint i = 0; i < _max_num_q; i++) { | 1315 for (uint i = 0; i < _max_num_q; i++) { |
1302 if (yield->should_return()) { | 1316 if (yield->should_return()) { |
1303 return; | 1317 return; |
1304 } | 1318 } |
1305 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive, | 1319 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive, |
1320 keep_alive, complete_gc, yield); | |
1321 } | |
1322 | |
1323 // Cleaner references. Included in timing for phantom references. We | |
1324 // expect Cleaner references to be temporary, and don't want to deal with | |
1325 // possible incompatibilities arising from making it more visible. | |
1326 for (uint i = 0; i < _max_num_q; i++) { | |
1327 if (yield->should_return()) { | |
1328 return; | |
1329 } | |
1330 preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive, | |
1306 keep_alive, complete_gc, yield); | 1331 keep_alive, complete_gc, yield); |
1307 } | 1332 } |
1308 } | 1333 } |
1309 } | 1334 } |
1310 | 1335 |
1371 switch (j) { | 1396 switch (j) { |
1372 case 0: return "SoftRef"; | 1397 case 0: return "SoftRef"; |
1373 case 1: return "WeakRef"; | 1398 case 1: return "WeakRef"; |
1374 case 2: return "FinalRef"; | 1399 case 2: return "FinalRef"; |
1375 case 3: return "PhantomRef"; | 1400 case 3: return "PhantomRef"; |
1401 case 4: return "CleanerRef"; | |
1376 } | 1402 } |
1377 ShouldNotReachHere(); | 1403 ShouldNotReachHere(); |
1378 return NULL; | 1404 return NULL; |
1379 } | 1405 } |
1380 | 1406 |