< prev index next >

src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp

Print this page
rev 14452 : [mq]: onebitmap.patch

*** 160,169 **** --- 160,181 ---- GCIdMark gc_id_mark; TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters()); TraceMemoryManagerStats tmms(false, GCCause::_no_cause_specified); + // Mark requires clean bitmaps. Clear them here, before diving into STW. + // There is a potential race from this moment on to TAMS reset in init mark: the bitmaps + // would be clear, but TAMS not yet updated. + { + GCTraceTime(Info, gc) time("Concurrent cleanup", gc_timer, GCCause::_no_gc, true); + ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_cleanup); + ShenandoahGCPhase phase_reset(ShenandoahPhaseTimings::conc_cleanup_reset_bitmaps); + WorkGang *workers = heap->workers(); + ShenandoahPushWorkerScope scope(workers, ConcGCThreads); + heap->reset_mark_bitmap(workers); + } + // Start initial mark under STW: { // Workers are setup by VM_ShenandoahInitMark TraceCollectorStats tcs(heap->monitoring_support()->stw_collection_counters()); ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause_gross);
*** 310,319 **** --- 322,342 ---- ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross); ShenandoahGCPhase final_update_refs_phase(ShenandoahPhaseTimings::final_update_refs_gross); VM_ShenandoahFinalUpdateRefs final_update_refs; VMThread::execute(&final_update_refs); } + + if (do_it) { + GCTraceTime(Info, gc) time("Concurrent cleanup", gc_timer, GCCause::_no_gc, true); + ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_cleanup); + ShenandoahGCPhase phase_recycle(ShenandoahPhaseTimings::conc_cleanup_recycle); + heap->recycle_trash(); + } + + // Allocations happen during bitmap cleanup, record peak after the phase: + heap->shenandoahPolicy()->record_peak_occupancy(); + } else { // If update-refs were skipped, need to do another verification pass after evacuation. if (ShenandoahVerify && !check_cancellation()) { VM_ShenandoahVerifyHeapAfterEvacuation verify_after_evacuation; VMThread::execute(&verify_after_evacuation);
*** 325,354 **** if (clear_full_gc) { reset_full_gc(); } - { - GCTraceTime(Info, gc) time("Concurrent cleanup", gc_timer, GCCause::_no_gc, true); - ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_cleanup); - - { - ShenandoahGCPhase phase_recycle(ShenandoahPhaseTimings::conc_cleanup_recycle); - heap->recycle_trash(); - } - - { - ShenandoahGCPhase phase_reset(ShenandoahPhaseTimings::conc_cleanup_reset_bitmaps); - WorkGang *workers = heap->workers(); - ShenandoahPushWorkerScope scope(workers, ConcGCThreads); - heap->reset_next_mark_bitmap(workers); - } - } - - // Allocations happen during bitmap cleanup, record peak after the phase: - heap->shenandoahPolicy()->record_peak_occupancy(); - // Cycle is complete heap->shenandoahPolicy()->record_cycle_end(); // TODO: Call this properly with Shenandoah*CycleMark heap->set_used_at_last_gc(); --- 348,357 ----
< prev index next >