hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
changeset 756 dc1ba65c5d1e
parent 389 a44227868a4a
child 971 f0b20be4165d
child 781 e1baa9c8f16f
equal deleted inserted replaced
755:276b923963c3 756:dc1ba65c5d1e
  1002     heap->perm_gen()->verify_object_start_array();
  1002     heap->perm_gen()->verify_object_start_array();
  1003   }
  1003   }
  1004 
  1004 
  1005   DEBUG_ONLY(mark_bitmap()->verify_clear();)
  1005   DEBUG_ONLY(mark_bitmap()->verify_clear();)
  1006   DEBUG_ONLY(summary_data().verify_clear();)
  1006   DEBUG_ONLY(summary_data().verify_clear();)
       
  1007 
       
  1008   // Have worker threads release resources the next time they run a task.
       
  1009   gc_task_manager()->release_all_resources();
  1007 }
  1010 }
  1008 
  1011 
  1009 void PSParallelCompact::post_compact()
  1012 void PSParallelCompact::post_compact()
  1010 {
  1013 {
  1011   TraceTime tm("post compact", print_phases(), true, gclog_or_tty);
  1014   TraceTime tm("post compact", print_phases(), true, gclog_or_tty);
  1947 
  1950 
  1948   TimeStamp marking_start;
  1951   TimeStamp marking_start;
  1949   TimeStamp compaction_start;
  1952   TimeStamp compaction_start;
  1950   TimeStamp collection_exit;
  1953   TimeStamp collection_exit;
  1951 
  1954 
  1952   // "serial_CM" is needed until the parallel implementation
       
  1953   // of the move and update is done.
       
  1954   ParCompactionManager* serial_CM = new ParCompactionManager();
       
  1955   // Don't initialize more than once.
       
  1956   // serial_CM->initialize(&summary_data(), mark_bitmap());
       
  1957 
       
  1958   ParallelScavengeHeap* heap = gc_heap();
  1955   ParallelScavengeHeap* heap = gc_heap();
  1959   GCCause::Cause gc_cause = heap->gc_cause();
  1956   GCCause::Cause gc_cause = heap->gc_cause();
  1960   PSYoungGen* young_gen = heap->young_gen();
  1957   PSYoungGen* young_gen = heap->young_gen();
  1961   PSOldGen* old_gen = heap->old_gen();
  1958   PSOldGen* old_gen = heap->old_gen();
  1962   PSPermGen* perm_gen = heap->perm_gen();
  1959   PSPermGen* perm_gen = heap->perm_gen();
  1967   // Make sure data structures are sane, make the heap parsable, and do other
  1964   // Make sure data structures are sane, make the heap parsable, and do other
  1968   // miscellaneous bookkeeping.
  1965   // miscellaneous bookkeeping.
  1969   PreGCValues pre_gc_values;
  1966   PreGCValues pre_gc_values;
  1970   pre_compact(&pre_gc_values);
  1967   pre_compact(&pre_gc_values);
  1971 
  1968 
       
  1969   // Get the compaction manager reserved for the VM thread.
       
  1970   ParCompactionManager* const vmthread_cm =
       
  1971     ParCompactionManager::manager_array(gc_task_manager()->workers());
       
  1972 
  1972   // Place after pre_compact() where the number of invocations is incremented.
  1973   // Place after pre_compact() where the number of invocations is incremented.
  1973   AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
  1974   AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
  1974 
  1975 
  1975   {
  1976   {
  1976     ResourceMark rm;
  1977     ResourceMark rm;
  2006     ref_processor()->enable_discovery();
  2007     ref_processor()->enable_discovery();
  2007 
  2008 
  2008     bool marked_for_unloading = false;
  2009     bool marked_for_unloading = false;
  2009 
  2010 
  2010     marking_start.update();
  2011     marking_start.update();
  2011     marking_phase(serial_CM, maximum_heap_compaction);
  2012     marking_phase(vmthread_cm, maximum_heap_compaction);
  2012 
  2013 
  2013 #ifndef PRODUCT
  2014 #ifndef PRODUCT
  2014     if (TraceParallelOldGCMarkingPhase) {
  2015     if (TraceParallelOldGCMarkingPhase) {
  2015       gclog_or_tty->print_cr("marking_phase: cas_tries %d  cas_retries %d "
  2016       gclog_or_tty->print_cr("marking_phase: cas_tries %d  cas_retries %d "
  2016         "cas_by_another %d",
  2017         "cas_by_another %d",
  2037       PSMarkSweep::mark_sweep_phase1(maximum_heap_compaction);
  2038       PSMarkSweep::mark_sweep_phase1(maximum_heap_compaction);
  2038     }
  2039     }
  2039 #endif
  2040 #endif
  2040 
  2041 
  2041     bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc;
  2042     bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc;
  2042     summary_phase(serial_CM, maximum_heap_compaction || max_on_system_gc);
  2043     summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
  2043 
  2044 
  2044 #ifdef ASSERT
  2045 #ifdef ASSERT
  2045     if (VerifyParallelOldWithMarkSweep &&
  2046     if (VerifyParallelOldWithMarkSweep &&
  2046         (PSParallelCompact::total_invocations() %
  2047         (PSParallelCompact::total_invocations() %
  2047            VerifyParallelOldWithMarkSweepInterval) == 0) {
  2048            VerifyParallelOldWithMarkSweepInterval) == 0) {
  2065            VerifyParallelOldWithMarkSweepInterval) == 0) {
  2066            VerifyParallelOldWithMarkSweepInterval) == 0) {
  2066       // Do a separate verify phase so that the verify
  2067       // Do a separate verify phase so that the verify
  2067       // code can use the the forwarding pointers to
  2068       // code can use the the forwarding pointers to
  2068       // check the new pointer calculation.  The restore_marks()
  2069       // check the new pointer calculation.  The restore_marks()
  2069       // has to be done before the real compact.
  2070       // has to be done before the real compact.
  2070       serial_CM->set_action(ParCompactionManager::VerifyUpdate);
  2071       vmthread_cm->set_action(ParCompactionManager::VerifyUpdate);
  2071       compact_perm(serial_CM);
  2072       compact_perm(vmthread_cm);
  2072       compact_serial(serial_CM);
  2073       compact_serial(vmthread_cm);
  2073       serial_CM->set_action(ParCompactionManager::ResetObjects);
  2074       vmthread_cm->set_action(ParCompactionManager::ResetObjects);
  2074       compact_perm(serial_CM);
  2075       compact_perm(vmthread_cm);
  2075       compact_serial(serial_CM);
  2076       compact_serial(vmthread_cm);
  2076       serial_CM->set_action(ParCompactionManager::UpdateAndCopy);
  2077       vmthread_cm->set_action(ParCompactionManager::UpdateAndCopy);
  2077 
  2078 
  2078       // For debugging only
  2079       // For debugging only
  2079       PSMarkSweep::restore_marks();
  2080       PSMarkSweep::restore_marks();
  2080       PSMarkSweep::deallocate_stacks();
  2081       PSMarkSweep::deallocate_stacks();
  2081     }
  2082     }
  2082 #endif
  2083 #endif
  2083 
  2084 
  2084     compaction_start.update();
  2085     compaction_start.update();
  2085     // Does the perm gen always have to be done serially because
  2086     // Does the perm gen always have to be done serially because
  2086     // klasses are used in the update of an object?
  2087     // klasses are used in the update of an object?
  2087     compact_perm(serial_CM);
  2088     compact_perm(vmthread_cm);
  2088 
  2089 
  2089     if (UseParallelOldGCCompacting) {
  2090     if (UseParallelOldGCCompacting) {
  2090       compact();
  2091       compact();
  2091     } else {
  2092     } else {
  2092       compact_serial(serial_CM);
  2093       compact_serial(vmthread_cm);
  2093     }
  2094     }
  2094 
       
  2095     delete serial_CM;
       
  2096 
  2095 
  2097     // Reset the mark bitmap, summary data, and do other bookkeeping.  Must be
  2096     // Reset the mark bitmap, summary data, and do other bookkeeping.  Must be
  2098     // done before resizing.
  2097     // done before resizing.
  2099     post_compact();
  2098     post_compact();
  2100 
  2099