RFR (S): Avoid evacuation if concurrent GC was cancelled
Roman Kennke
rkennke at redhat.com
Mon Dec 5 17:47:03 UTC 2016
Ah yes I see what you mean. Yes we can change to assert_locked_or_safepoint() there.
/Roman
Am 05.12.2016 6:44 nachm. schrieb Zhengyu Gu <zgu at redhat.com>:
>
> On 12/05/2016 12:28 PM, Roman Kennke wrote:
>
> > Am Montag, den 05.12.2016, 12:25 -0500 schrieb Zhengyu Gu:
> >> 114 // b. Cancel evacuation, if in progress
> >> 115 if (_heap->is_evacuation_in_progress()) {
> >> 116 MutexLocker mu(Threads_lock);
> >> 117 _heap->set_evacuation_in_progress(false);
> >> 118 }
> >>
> >>
> >> I think that we can eliminate Threads_lock above by changing the
> >> assertion below:
> >>
> >> void JavaThread::set_evacuation_in_progress_all_threads(bool in_prog)
> >> {
> >> assert(Threads_lock->owned_by_self(), "must hold
> >> Threads_lock"); <==== assert_locked_or_safepoint(Threads_lock)
> >> _evacuation_in_progress_global = in_prog;
> >> for (JavaThread* t = Threads::first(); t != NULL; t = t->next()) {
> >> t->set_evacuation_in_progress(in_prog);
> >> }
> >> }
> > No, I don't think so. We're iterating over the threads, so we should
> > hold that lock. However, as I mentioned in that other email, the
> > VMThread should already hold it. Now that I think about it again, it's
> > probably not going to deadlock, it's simply re-entrant. In any case,
> > acquiring it should not be necessary.
>
> I think that it is safe to iterate over the thread list without the Thread_lock during safepoint.
>
> Check following code:
>
> void Threads::threads_do(ThreadClosure* tc) {
> assert_locked_or_safepoint(Threads_lock);
> // ALL_JAVA_THREADS iterates through all JavaThreads
> ALL_JAVA_THREADS(p) {
> tc->do_thread(p);
> }
>
> ....
>
>
> -Zhengyu
>
>
>
>
> > Roman
> >
> >>
> >> Thanks,
> >>
> >> -Zhengyu
> >>
> >> On 12/05/2016 11:00 AM, Aleksey Shipilev wrote:
> >>> Hi,
> >>>
> >>> Currently, when concurrent GC is canceled, we still enter the VM
> >>> operation for
> >>> concurrent evacuation, only to exit it quickly and slide into the
> >>> full GC. This
> >>> causes *two* back-to-back safepoints: one short from evac, and
> >>> another large for
> >>> full GC. While short one is normally short, it can hit the unlucky
> >>> scheduling
> >>> outlier and drag the pause time up.
> >>>
> >>> This change avoids going to evac if conc GC was canceled:
> >>> http://cr.openjdk.java.net/~shade/shenandoah/cancel-no-evac/webr
> >>> ev.01/
> >>>
> >>> Additionally, it resets the mark bitmaps before full GC with
> >>> parallel workers,
> >>> not concurrent ones, which would be important once Zhengyu trims
> >>> down the number
> >>> of concurrent workers.
> >>>
> >>> Testing: hotspot_gc_shenandoah, jcstress (tests-all/quick)
> >>>
> >>> Thanks,
> >>> -Aleksey
> >>>
>
More information about the shenandoah-dev
mailing list