Mercurial > hg > graal-compiler
comparison src/share/vm/memory/genCollectedHeap.cpp @ 20278:2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
Reviewed-by: tschatzl, ehelin, brutisso, coleenp, roland, iveresov
Contributed-by: stefan.karlsson@oracle.com, mikael.gerdin@oracle.com
author | stefank |
---|---|
date | Mon, 07 Jul 2014 10:12:40 +0200 |
parents | 30c99d8e0f02 |
children | 3f2894c5052e |
comparison
equal
deleted
inserted
replaced
20277:882004b9e7e1 | 20278: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 |