equal
deleted
inserted
replaced
388 ShenandoahHeapLocker lock(_heap->lock()); |
388 ShenandoahHeapLocker lock(_heap->lock()); |
389 prepare(); |
389 prepare(); |
390 } |
390 } |
391 |
391 |
392 _heap->set_concurrent_traversal_in_progress(true); |
392 _heap->set_concurrent_traversal_in_progress(true); |
|
393 _heap->set_has_forwarded_objects(true); |
393 |
394 |
394 bool process_refs = _heap->process_references(); |
395 bool process_refs = _heap->process_references(); |
395 if (process_refs) { |
396 if (process_refs) { |
396 ReferenceProcessor* rp = _heap->ref_processor(); |
397 ReferenceProcessor* rp = _heap->ref_processor(); |
397 rp->enable_discovery(true /*verify_no_refs*/); |
398 rp->enable_discovery(true /*verify_no_refs*/); |
599 assert(_task_queues->is_empty(), "queues must be empty after traversal GC"); |
600 assert(_task_queues->is_empty(), "queues must be empty after traversal GC"); |
600 TASKQUEUE_STATS_ONLY(_task_queues->print_taskqueue_stats()); |
601 TASKQUEUE_STATS_ONLY(_task_queues->print_taskqueue_stats()); |
601 TASKQUEUE_STATS_ONLY(_task_queues->reset_taskqueue_stats()); |
602 TASKQUEUE_STATS_ONLY(_task_queues->reset_taskqueue_stats()); |
602 |
603 |
603 // No more marking expected |
604 // No more marking expected |
|
605 _heap->set_concurrent_traversal_in_progress(false); |
604 _heap->mark_complete_marking_context(); |
606 _heap->mark_complete_marking_context(); |
605 |
607 |
606 fixup_roots(); |
608 fixup_roots(); |
607 _heap->parallel_cleaning(false); |
609 _heap->parallel_cleaning(false); |
|
610 |
|
611 _heap->set_has_forwarded_objects(false); |
608 |
612 |
609 // Resize metaspace |
613 // Resize metaspace |
610 MetaspaceGC::compute_new_size(); |
614 MetaspaceGC::compute_new_size(); |
611 |
615 |
612 // Still good? We can now trash the cset, and make final verification |
616 // Still good? We can now trash the cset, and make final verification |
649 _heap->free_set()->rebuild(); |
653 _heap->free_set()->rebuild(); |
650 reset(); |
654 reset(); |
651 } |
655 } |
652 |
656 |
653 assert(_task_queues->is_empty(), "queues must be empty after traversal GC"); |
657 assert(_task_queues->is_empty(), "queues must be empty after traversal GC"); |
654 _heap->set_concurrent_traversal_in_progress(false); |
|
655 assert(!_heap->cancelled_gc(), "must not be cancelled when getting out here"); |
658 assert(!_heap->cancelled_gc(), "must not be cancelled when getting out here"); |
656 |
659 |
657 if (ShenandoahVerify) { |
660 if (ShenandoahVerify) { |
658 _heap->verifier()->verify_after_traversal(); |
661 _heap->verifier()->verify_after_traversal(); |
659 } |
662 } |