src/share/vm/memory/genCollectedHeap.cpp

changeset 6992
2c6ef90f030a
parent 6978
30c99d8e0f02
child 7009
3f2894c5052e
equal deleted inserted replaced
6991:882004b9e7e1 6992:2c6ef90f030a
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

mercurial