hotspot/src/share/vm/gc/parallel/psScavenge.cpp
changeset 33107 77bf0d2069a3
parent 33105 294e48b4f704
child 33143 2083f82acec8
equal deleted inserted replaced
33106:20c533b9e167 33107:77bf0d2069a3
    34 #include "gc/parallel/psScavenge.inline.hpp"
    34 #include "gc/parallel/psScavenge.inline.hpp"
    35 #include "gc/parallel/psTasks.hpp"
    35 #include "gc/parallel/psTasks.hpp"
    36 #include "gc/shared/collectorPolicy.hpp"
    36 #include "gc/shared/collectorPolicy.hpp"
    37 #include "gc/shared/gcCause.hpp"
    37 #include "gc/shared/gcCause.hpp"
    38 #include "gc/shared/gcHeapSummary.hpp"
    38 #include "gc/shared/gcHeapSummary.hpp"
       
    39 #include "gc/shared/gcId.hpp"
    39 #include "gc/shared/gcLocker.inline.hpp"
    40 #include "gc/shared/gcLocker.inline.hpp"
    40 #include "gc/shared/gcTimer.hpp"
    41 #include "gc/shared/gcTimer.hpp"
    41 #include "gc/shared/gcTrace.hpp"
    42 #include "gc/shared/gcTrace.hpp"
    42 #include "gc/shared/gcTraceTime.hpp"
    43 #include "gc/shared/gcTraceTime.hpp"
    43 #include "gc/shared/isGCActiveMark.hpp"
    44 #include "gc/shared/isGCActiveMark.hpp"
   276   // Check for potential problems.
   277   // Check for potential problems.
   277   if (!should_attempt_scavenge()) {
   278   if (!should_attempt_scavenge()) {
   278     return false;
   279     return false;
   279   }
   280   }
   280 
   281 
       
   282   GCIdMark gc_id_mark;
   281   _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start());
   283   _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start());
   282 
   284 
   283   bool promotion_failure_occurred = false;
   285   bool promotion_failure_occurred = false;
   284 
   286 
   285   PSYoungGen* young_gen = heap->young_gen();
   287   PSYoungGen* young_gen = heap->young_gen();
   320   {
   322   {
   321     ResourceMark rm;
   323     ResourceMark rm;
   322     HandleMark hm;
   324     HandleMark hm;
   323 
   325 
   324     TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
   326     TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
   325     GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL, _gc_tracer.gc_id());
   327     GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL);
   326     TraceCollectorStats tcs(counters());
   328     TraceCollectorStats tcs(counters());
   327     TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
   329     TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
   328 
   330 
   329     if (TraceYoungGenTime) accumulated_time()->start();
   331     if (TraceYoungGenTime) accumulated_time()->start();
   330 
   332 
   385     PSPromotionManager::pre_scavenge();
   387     PSPromotionManager::pre_scavenge();
   386 
   388 
   387     // We'll use the promotion manager again later.
   389     // We'll use the promotion manager again later.
   388     PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager();
   390     PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager();
   389     {
   391     {
   390       GCTraceTime tm("Scavenge", false, false, &_gc_timer, _gc_tracer.gc_id());
   392       GCTraceTime tm("Scavenge", false, false, &_gc_timer);
   391       ParallelScavengeHeap::ParStrongRootsScope psrs;
   393       ParallelScavengeHeap::ParStrongRootsScope psrs;
   392 
   394 
   393       GCTaskQueue* q = GCTaskQueue::create();
   395       GCTaskQueue* q = GCTaskQueue::create();
   394 
   396 
   395       if (!old_gen->object_space()->is_empty()) {
   397       if (!old_gen->object_space()->is_empty()) {
   427 
   429 
   428     scavenge_midpoint.update();
   430     scavenge_midpoint.update();
   429 
   431 
   430     // Process reference objects discovered during scavenge
   432     // Process reference objects discovered during scavenge
   431     {
   433     {
   432       GCTraceTime tm("References", false, false, &_gc_timer, _gc_tracer.gc_id());
   434       GCTraceTime tm("References", false, false, &_gc_timer);
   433 
   435 
   434       reference_processor()->setup_policy(false); // not always_clear
   436       reference_processor()->setup_policy(false); // not always_clear
   435       reference_processor()->set_active_mt_degree(active_workers);
   437       reference_processor()->set_active_mt_degree(active_workers);
   436       PSKeepAliveClosure keep_alive(promotion_manager);
   438       PSKeepAliveClosure keep_alive(promotion_manager);
   437       PSEvacuateFollowersClosure evac_followers(promotion_manager);
   439       PSEvacuateFollowersClosure evac_followers(promotion_manager);
   438       ReferenceProcessorStats stats;
   440       ReferenceProcessorStats stats;
   439       if (reference_processor()->processing_is_mt()) {
   441       if (reference_processor()->processing_is_mt()) {
   440         PSRefProcTaskExecutor task_executor;
   442         PSRefProcTaskExecutor task_executor;
   441         stats = reference_processor()->process_discovered_references(
   443         stats = reference_processor()->process_discovered_references(
   442           &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
   444           &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
   443           &_gc_timer, _gc_tracer.gc_id());
   445           &_gc_timer);
   444       } else {
   446       } else {
   445         stats = reference_processor()->process_discovered_references(
   447         stats = reference_processor()->process_discovered_references(
   446           &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer, _gc_tracer.gc_id());
   448           &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer);
   447       }
   449       }
   448 
   450 
   449       _gc_tracer.report_gc_reference_stats(stats);
   451       _gc_tracer.report_gc_reference_stats(stats);
   450 
   452 
   451       // Enqueue reference objects discovered during scavenge.
   453       // Enqueue reference objects discovered during scavenge.
   456         reference_processor()->enqueue_discovered_references(NULL);
   458         reference_processor()->enqueue_discovered_references(NULL);
   457       }
   459       }
   458     }
   460     }
   459 
   461 
   460     {
   462     {
   461       GCTraceTime tm("StringTable", false, false, &_gc_timer, _gc_tracer.gc_id());
   463       GCTraceTime tm("StringTable", false, false, &_gc_timer);
   462       // Unlink any dead interned Strings and process the remaining live ones.
   464       // Unlink any dead interned Strings and process the remaining live ones.
   463       PSScavengeRootsClosure root_closure(promotion_manager);
   465       PSScavengeRootsClosure root_closure(promotion_manager);
   464       StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
   466       StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
   465     }
   467     }
   466 
   468 
   626     COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
   628     COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
   627 
   629 
   628     NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
   630     NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
   629 
   631 
   630     {
   632     {
   631       GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer, _gc_tracer.gc_id());
   633       GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer);
   632 
   634 
   633       CodeCache::prune_scavenge_root_nmethods();
   635       CodeCache::prune_scavenge_root_nmethods();
   634     }
   636     }
   635 
   637 
   636     // Re-verify object start arrays
   638     // Re-verify object start arrays