RFR (S): Avoid evacuation if concurrent GC was cancelled

Zhengyu Gu zgu at redhat.com
Mon Dec 5 17:43:59 UTC 2016


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