59 #endif // INCLUDE_ALL_GCS |
59 #endif // INCLUDE_ALL_GCS |
60 |
60 |
61 GenCollectedHeap* GenCollectedHeap::_gch; |
61 GenCollectedHeap* GenCollectedHeap::_gch; |
62 NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;) |
62 NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;) |
63 |
63 |
64 // The set of potentially parallel tasks in strong root scanning. |
64 // The set of potentially parallel tasks in root scanning. |
65 enum GCH_process_strong_roots_tasks { |
65 enum GCH_strong_roots_tasks { |
66 // We probably want to parallelize both of these internally, but for now... |
66 // We probably want to parallelize both of these internally, but for now... |
67 GCH_PS_younger_gens, |
67 GCH_PS_younger_gens, |
68 // Leave this one last. |
68 // Leave this one last. |
69 GCH_PS_NumElements |
69 GCH_PS_NumElements |
70 }; |
70 }; |
71 |
71 |
72 GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) : |
72 GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) : |
73 SharedHeap(policy), |
73 SharedHeap(policy), |
74 _gen_policy(policy), |
74 _gen_policy(policy), |
75 _gen_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)), |
75 _gen_process_roots_tasks(new SubTasksDone(GCH_PS_NumElements)), |
76 _full_collections_completed(0) |
76 _full_collections_completed(0) |
77 { |
77 { |
78 if (_gen_process_strong_tasks == NULL || |
78 if (_gen_process_roots_tasks == NULL || |
79 !_gen_process_strong_tasks->valid()) { |
79 !_gen_process_roots_tasks->valid()) { |
80 vm_exit_during_initialization("Failed necessary allocation."); |
80 vm_exit_during_initialization("Failed necessary allocation."); |
81 } |
81 } |
82 assert(policy != NULL, "Sanity check"); |
82 assert(policy != NULL, "Sanity check"); |
83 } |
83 } |
84 |
84 |
588 return collector_policy()->satisfy_failed_allocation(size, is_tlab); |
588 return collector_policy()->satisfy_failed_allocation(size, is_tlab); |
589 } |
589 } |
590 |
590 |
591 void GenCollectedHeap::set_par_threads(uint t) { |
591 void GenCollectedHeap::set_par_threads(uint t) { |
592 SharedHeap::set_par_threads(t); |
592 SharedHeap::set_par_threads(t); |
593 _gen_process_strong_tasks->set_n_threads(t); |
593 _gen_process_roots_tasks->set_n_threads(t); |
594 } |
594 } |
595 |
595 |
596 void GenCollectedHeap:: |
596 void GenCollectedHeap:: |
597 gen_process_strong_roots(int level, |
597 gen_process_roots(int level, |
598 bool younger_gens_as_roots, |
598 bool younger_gens_as_roots, |
599 bool activate_scope, |
599 bool activate_scope, |
600 SharedHeap::ScanningOption so, |
600 SharedHeap::ScanningOption so, |
601 OopsInGenClosure* not_older_gens, |
601 OopsInGenClosure* not_older_gens, |
602 OopsInGenClosure* older_gens, |
602 OopsInGenClosure* weak_roots, |
603 KlassClosure* klass_closure) { |
603 OopsInGenClosure* older_gens, |
604 // General strong roots. |
604 CLDClosure* cld_closure, |
605 |
605 CLDClosure* weak_cld_closure, |
606 SharedHeap::process_strong_roots(activate_scope, so, |
606 CodeBlobClosure* code_closure) { |
607 not_older_gens, klass_closure); |
607 |
|
608 // General roots. |
|
609 SharedHeap::process_roots(activate_scope, so, |
|
610 not_older_gens, weak_roots, |
|
611 cld_closure, weak_cld_closure, |
|
612 code_closure); |
608 |
613 |
609 if (younger_gens_as_roots) { |
614 if (younger_gens_as_roots) { |
610 if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) { |
615 if (!_gen_process_roots_tasks->is_task_claimed(GCH_PS_younger_gens)) { |
611 for (int i = 0; i < level; i++) { |
616 for (int i = 0; i < level; i++) { |
612 not_older_gens->set_generation(_gens[i]); |
617 not_older_gens->set_generation(_gens[i]); |
613 _gens[i]->oop_iterate(not_older_gens); |
618 _gens[i]->oop_iterate(not_older_gens); |
614 } |
619 } |
615 not_older_gens->reset_generation(); |
620 not_older_gens->reset_generation(); |
621 older_gens->set_generation(_gens[i]); |
626 older_gens->set_generation(_gens[i]); |
622 rem_set()->younger_refs_iterate(_gens[i], older_gens); |
627 rem_set()->younger_refs_iterate(_gens[i], older_gens); |
623 older_gens->reset_generation(); |
628 older_gens->reset_generation(); |
624 } |
629 } |
625 |
630 |
626 _gen_process_strong_tasks->all_tasks_completed(); |
631 _gen_process_roots_tasks->all_tasks_completed(); |
|
632 } |
|
633 |
|
634 void GenCollectedHeap:: |
|
635 gen_process_roots(int level, |
|
636 bool younger_gens_as_roots, |
|
637 bool activate_scope, |
|
638 SharedHeap::ScanningOption so, |
|
639 bool only_strong_roots, |
|
640 OopsInGenClosure* not_older_gens, |
|
641 OopsInGenClosure* older_gens, |
|
642 CLDClosure* cld_closure) { |
|
643 |
|
644 const bool is_adjust_phase = !only_strong_roots && !younger_gens_as_roots; |
|
645 |
|
646 bool is_moving_collection = false; |
|
647 if (level == 0 || is_adjust_phase) { |
|
648 // young collections are always moving |
|
649 is_moving_collection = true; |
|
650 } |
|
651 |
|
652 MarkingCodeBlobClosure mark_code_closure(not_older_gens, is_moving_collection); |
|
653 CodeBlobClosure* code_closure = &mark_code_closure; |
|
654 |
|
655 gen_process_roots(level, |
|
656 younger_gens_as_roots, |
|
657 activate_scope, so, |
|
658 not_older_gens, only_strong_roots ? NULL : not_older_gens, |
|
659 older_gens, |
|
660 cld_closure, only_strong_roots ? NULL : cld_closure, |
|
661 code_closure); |
|
662 |
627 } |
663 } |
628 |
664 |
629 void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) { |
665 void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) { |
630 SharedHeap::process_weak_roots(root_closure); |
666 SharedHeap::process_weak_roots(root_closure); |
631 // "Local" "weak" refs |
667 // "Local" "weak" refs |