comparison src/share/vm/gc_implementation/g1/concurrentMark.cpp @ 20619:b12a2a9b05ca

8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse Reviewed-by: mgerdin, coleenp, bdelsart
author stefank
date Thu, 02 Oct 2014 10:55:36 +0200
parents e7d0505c8a30
children 8d27d6113625
comparison
equal deleted inserted replaced
20618:7024b693c8f9 20619:b12a2a9b05ca
21 * questions. 21 * questions.
22 * 22 *
23 */ 23 */
24 24
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "classfile/metadataOnStackMark.hpp"
26 #include "classfile/symbolTable.hpp" 27 #include "classfile/symbolTable.hpp"
27 #include "code/codeCache.hpp" 28 #include "code/codeCache.hpp"
28 #include "gc_implementation/g1/concurrentMark.inline.hpp" 29 #include "gc_implementation/g1/concurrentMark.inline.hpp"
29 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp" 30 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
30 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" 31 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
2600 // Unload Klasses, String, Symbols, Code Cache, etc. 2601 // Unload Klasses, String, Symbols, Code Cache, etc.
2601 { 2602 {
2602 G1RemarkGCTraceTime trace("Unloading", G1Log::finer()); 2603 G1RemarkGCTraceTime trace("Unloading", G1Log::finer());
2603 2604
2604 if (ClassUnloadingWithConcurrentMark) { 2605 if (ClassUnloadingWithConcurrentMark) {
2606 // Cleaning of klasses depends on correct information from MetadataMarkOnStack. The CodeCache::mark_on_stack
2607 // part is too slow to be done serially, so it is handled during the weakRefsWorkParallelPart phase.
2608 // Defer the cleaning until we have complete on_stack data.
2609 MetadataOnStackMark md_on_stack(false /* Don't visit the code cache at this point */);
2610
2605 bool purged_classes; 2611 bool purged_classes;
2606 2612
2607 { 2613 {
2608 G1RemarkGCTraceTime trace("System Dictionary Unloading", G1Log::finest()); 2614 G1RemarkGCTraceTime trace("System Dictionary Unloading", G1Log::finest());
2609 purged_classes = SystemDictionary::do_unloading(&g1_is_alive); 2615 purged_classes = SystemDictionary::do_unloading(&g1_is_alive, false /* Defer klass cleaning */);
2610 } 2616 }
2611 2617
2612 { 2618 {
2613 G1RemarkGCTraceTime trace("Parallel Unloading", G1Log::finest()); 2619 G1RemarkGCTraceTime trace("Parallel Unloading", G1Log::finest());
2614 weakRefsWorkParallelPart(&g1_is_alive, purged_classes); 2620 weakRefsWorkParallelPart(&g1_is_alive, purged_classes);
2621 }
2622
2623 {
2624 G1RemarkGCTraceTime trace("Deallocate Metadata", G1Log::finest());
2625 ClassLoaderDataGraph::free_deallocate_lists();
2615 } 2626 }
2616 } 2627 }
2617 2628
2618 if (G1StringDedup::is_enabled()) { 2629 if (G1StringDedup::is_enabled()) {
2619 G1RemarkGCTraceTime trace("String Deduplication Unlink", G1Log::finest()); 2630 G1RemarkGCTraceTime trace("String Deduplication Unlink", G1Log::finest());