Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @ 1836:894b1d7c7e01
6423256: GC stacks should use a better data structure
6942771: SEGV in ParScanThreadState::take_from_overflow_stack
Reviewed-by: apetrusenko, ysr, pbk
author | jcoomes |
---|---|
date | Tue, 28 Sep 2010 15:56:15 -0700 |
parents | 8b10f48633dc |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1835:4805b9f4779e | 1836:894b1d7c7e01 |
---|---|
2168 // Track memory usage and detect low memory | 2168 // Track memory usage and detect low memory |
2169 MemoryService::track_memory_usage(); | 2169 MemoryService::track_memory_usage(); |
2170 heap->update_counters(); | 2170 heap->update_counters(); |
2171 } | 2171 } |
2172 | 2172 |
2173 #ifdef ASSERT | |
2174 for (size_t i = 0; i < ParallelGCThreads + 1; ++i) { | |
2175 ParCompactionManager* const cm = | |
2176 ParCompactionManager::manager_array(int(i)); | |
2177 assert(cm->marking_stack()->is_empty(), "should be empty"); | |
2178 assert(cm->region_stack()->is_empty(), "should be empty"); | |
2179 assert(cm->revisit_klass_stack()->is_empty(), "should be empty"); | |
2180 } | |
2181 #endif // ASSERT | |
2182 | |
2173 if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) { | 2183 if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) { |
2174 HandleMark hm; // Discard invalid handles created during verification | 2184 HandleMark hm; // Discard invalid handles created during verification |
2175 gclog_or_tty->print(" VerifyAfterGC:"); | 2185 gclog_or_tty->print(" VerifyAfterGC:"); |
2176 Universe::verify(false); | 2186 Universe::verify(false); |
2177 } | 2187 } |
2709 void | 2719 void |
2710 PSParallelCompact::follow_weak_klass_links() { | 2720 PSParallelCompact::follow_weak_klass_links() { |
2711 // All klasses on the revisit stack are marked at this point. | 2721 // All klasses on the revisit stack are marked at this point. |
2712 // Update and follow all subklass, sibling and implementor links. | 2722 // Update and follow all subklass, sibling and implementor links. |
2713 if (PrintRevisitStats) { | 2723 if (PrintRevisitStats) { |
2714 gclog_or_tty->print_cr("#classes in system dictionary = %d", SystemDictionary::number_of_classes()); | 2724 gclog_or_tty->print_cr("#classes in system dictionary = %d", |
2725 SystemDictionary::number_of_classes()); | |
2715 } | 2726 } |
2716 for (uint i = 0; i < ParallelGCThreads + 1; i++) { | 2727 for (uint i = 0; i < ParallelGCThreads + 1; i++) { |
2717 ParCompactionManager* cm = ParCompactionManager::manager_array(i); | 2728 ParCompactionManager* cm = ParCompactionManager::manager_array(i); |
2718 KeepAliveClosure keep_alive_closure(cm); | 2729 KeepAliveClosure keep_alive_closure(cm); |
2719 int length = cm->revisit_klass_stack()->length(); | 2730 Stack<Klass*>* const rks = cm->revisit_klass_stack(); |
2720 if (PrintRevisitStats) { | 2731 if (PrintRevisitStats) { |
2721 gclog_or_tty->print_cr("Revisit klass stack[%d] length = %d", i, length); | 2732 gclog_or_tty->print_cr("Revisit klass stack[%u] length = " SIZE_FORMAT, |
2722 } | 2733 i, rks->size()); |
2723 for (int j = 0; j < length; j++) { | 2734 } |
2724 cm->revisit_klass_stack()->at(j)->follow_weak_klass_links( | 2735 while (!rks->is_empty()) { |
2725 is_alive_closure(), | 2736 Klass* const k = rks->pop(); |
2726 &keep_alive_closure); | 2737 k->follow_weak_klass_links(is_alive_closure(), &keep_alive_closure); |
2727 } | 2738 } |
2728 // revisit_klass_stack is cleared in reset() | 2739 |
2729 cm->follow_marking_stacks(); | 2740 cm->follow_marking_stacks(); |
2730 } | 2741 } |
2731 } | 2742 } |
2732 | 2743 |
2733 void | 2744 void |
2742 void PSParallelCompact::follow_mdo_weak_refs() { | 2753 void PSParallelCompact::follow_mdo_weak_refs() { |
2743 // All strongly reachable oops have been marked at this point; | 2754 // All strongly reachable oops have been marked at this point; |
2744 // we can visit and clear any weak references from MDO's which | 2755 // we can visit and clear any weak references from MDO's which |
2745 // we memoized during the strong marking phase. | 2756 // we memoized during the strong marking phase. |
2746 if (PrintRevisitStats) { | 2757 if (PrintRevisitStats) { |
2747 gclog_or_tty->print_cr("#classes in system dictionary = %d", SystemDictionary::number_of_classes()); | 2758 gclog_or_tty->print_cr("#classes in system dictionary = %d", |
2759 SystemDictionary::number_of_classes()); | |
2748 } | 2760 } |
2749 for (uint i = 0; i < ParallelGCThreads + 1; i++) { | 2761 for (uint i = 0; i < ParallelGCThreads + 1; i++) { |
2750 ParCompactionManager* cm = ParCompactionManager::manager_array(i); | 2762 ParCompactionManager* cm = ParCompactionManager::manager_array(i); |
2751 GrowableArray<DataLayout*>* rms = cm->revisit_mdo_stack(); | 2763 Stack<DataLayout*>* rms = cm->revisit_mdo_stack(); |
2752 int length = rms->length(); | |
2753 if (PrintRevisitStats) { | 2764 if (PrintRevisitStats) { |
2754 gclog_or_tty->print_cr("Revisit MDO stack[%d] length = %d", i, length); | 2765 gclog_or_tty->print_cr("Revisit MDO stack[%u] size = " SIZE_FORMAT, |
2755 } | 2766 i, rms->size()); |
2756 for (int j = 0; j < length; j++) { | 2767 } |
2757 rms->at(j)->follow_weak_refs(is_alive_closure()); | 2768 while (!rms->is_empty()) { |
2758 } | 2769 rms->pop()->follow_weak_refs(is_alive_closure()); |
2759 // revisit_mdo_stack is cleared in reset() | 2770 } |
2771 | |
2760 cm->follow_marking_stacks(); | 2772 cm->follow_marking_stacks(); |
2761 } | 2773 } |
2762 } | 2774 } |
2763 | 2775 |
2764 | 2776 |