Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp @ 453:c96030fff130
6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa
author | ysr |
---|---|
date | Thu, 20 Nov 2008 16:56:09 -0800 |
parents | 850fdf70db2b |
children | 27a80744a83b |
comparison
equal
deleted
inserted
replaced
452:00b023ae2d78 | 453:c96030fff130 |
---|---|
328 | 328 |
329 NOT_PRODUCT(reference_processor()->verify_no_references_recorded()); | 329 NOT_PRODUCT(reference_processor()->verify_no_references_recorded()); |
330 COMPILER2_PRESENT(DerivedPointerTable::clear()); | 330 COMPILER2_PRESENT(DerivedPointerTable::clear()); |
331 | 331 |
332 reference_processor()->enable_discovery(); | 332 reference_processor()->enable_discovery(); |
333 reference_processor()->snap_policy(false); | |
333 | 334 |
334 // We track how much was promoted to the next generation for | 335 // We track how much was promoted to the next generation for |
335 // the AdaptiveSizePolicy. | 336 // the AdaptiveSizePolicy. |
336 size_t old_gen_used_before = old_gen->used_in_bytes(); | 337 size_t old_gen_used_before = old_gen->used_in_bytes(); |
337 | 338 |
392 | 393 |
393 scavenge_midpoint.update(); | 394 scavenge_midpoint.update(); |
394 | 395 |
395 // Process reference objects discovered during scavenge | 396 // Process reference objects discovered during scavenge |
396 { | 397 { |
397 #ifdef COMPILER2 | 398 reference_processor()->snap_policy(false); // not always_clear |
398 ReferencePolicy *soft_ref_policy = new LRUMaxHeapPolicy(); | |
399 #else | |
400 ReferencePolicy *soft_ref_policy = new LRUCurrentHeapPolicy(); | |
401 #endif // COMPILER2 | |
402 | |
403 PSKeepAliveClosure keep_alive(promotion_manager); | 399 PSKeepAliveClosure keep_alive(promotion_manager); |
404 PSEvacuateFollowersClosure evac_followers(promotion_manager); | 400 PSEvacuateFollowersClosure evac_followers(promotion_manager); |
405 assert(soft_ref_policy != NULL,"No soft reference policy"); | |
406 if (reference_processor()->processing_is_mt()) { | 401 if (reference_processor()->processing_is_mt()) { |
407 PSRefProcTaskExecutor task_executor; | 402 PSRefProcTaskExecutor task_executor; |
408 reference_processor()->process_discovered_references( | 403 reference_processor()->process_discovered_references( |
409 soft_ref_policy, &_is_alive_closure, &keep_alive, &evac_followers, | 404 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor); |
410 &task_executor); | |
411 } else { | 405 } else { |
412 reference_processor()->process_discovered_references( | 406 reference_processor()->process_discovered_references( |
413 soft_ref_policy, &_is_alive_closure, &keep_alive, &evac_followers, | 407 &_is_alive_closure, &keep_alive, &evac_followers, NULL); |
414 NULL); | |
415 } | 408 } |
416 } | 409 } |
417 | 410 |
418 // Enqueue reference objects discovered during scavenge. | 411 // Enqueue reference objects discovered during scavenge. |
419 if (reference_processor()->processing_is_mt()) { | 412 if (reference_processor()->processing_is_mt()) { |