RFR: 8138920: Refactor the sampling thread from ConcurrentG1RefineThread

Bengt Rutisson bengt.rutisson at oracle.com
Fri Oct 9 16:01:10 UTC 2015


Hi Derek,

Comments inlined.

On 2015-10-09 00:29, Derek White wrote:
> Another call for review:
>
> 2nd webrev:
> http://cr.openjdk.java.net/~drwhite/8138920/webrev.02/
>
> See changes and comments below:
>
> On 10/8/15 2:47 AM, Bengt Rutisson wrote:
>>
>> Hi Derek,
>>
>> On 2015-10-07 17:19, Derek White wrote:
>>> Hi Bengt,
>>>
>>> On 10/7/15 4:02 AM, Bengt Rutisson wrote:
>>>> Hi Derek,
>>>>
>>>> Thanks for fixing this!
>>>>
>>>> On 2015-10-06 19:51, Derek White wrote:
>>>>> Refactor and cleanup the G1 concurrent thread classes:
>>>>>  - Pull out a sampling thread class (now ConcurrentG1SampleThread) 
>>>>> from ConcurrentG1RefineThread.
>>>>>  - Factor out an abstract base class ConcurrentG1ServiceThread 
>>>>> that is used by:
>>>>>     - ConcurrentG1RefineThread
>>>>>     - ConcurrentG1SampleThread
>>>>>     - ConcurrentMarkThread
>>>>>  - Made the handling of the "primary" refinement thread more explicit.
>>>>>  - Updated obsolete and confusing comments
>>>>>
>>>>> This is tech debt that also will allow disabling concurrent 
>>>>> refinement (if desired) and also fixes a P4 bug.
>>>>> Patch started by Thomas and improved and/or mangled myself.
>>>>>
>>>>> RFE: JDK-8138920 
>>>>> <https://bugs.openjdk.java.net/browse/JDK-8138920> Refactor the 
>>>>> sampling thread from ConcurrentG1RefineThread
>>>>>
>>>>> Webrev: http://cr.openjdk.java.net/~drwhite/8138920/webrev.01/
>>>>
>>>> Overall this looks really good to me.
>>>>
>>>> Some comments:
>>>>
>>>> No one seems to depend on ConcurrentG1ServiceThread::vtime_accum(). 
>>>> All uses have the specific subclass available. So, I don't think 
>>>> the pure virtual declaration in ConcurrentG1ServiceThread is 
>>>> needed. I'd just remove that and also make the corresponding 
>>>> methods in the subclasses non-virtual.
>>>
>>> OK. At some point we need to systematic rewrite of timing, but that 
>>> can wait.
>>
>> Quite agree.
>>
>>>> That more or less only leaves the run() and stop() methods in 
>>>> ConcurrentG1ServiceThread. It is kind of nice for the subclasses to 
>>>> get help with this, but I wonder if it is not possible to improve 
>>>> the ConcurrentGCThread class to help with this instead. Basically I 
>>>> guess I am a little unsure if the extra class 
>>>> ConcurrentG1ServiceThread is really needed.
>>>>
>>> I'll look at ConcurrentGCThread to see how well it could cover these 
>>> cases.
>>
>> Thanks. I think it is worth a try. If it doesn't turn out well we can 
>> keep the intermediate class, but I think it is worth exploring.
>
> I looked at pushing ConcurrentServiceThread up into 
> ConcurrentGCThread, but things got a little complicated. 
> ConcurrentG1RefineThread, ConcurrentMarkThread, and 
> ConcurrentSampleThread have a very "regularized" implementation of the 
> "termination protocol". G1StringDedupThread is slightly off from this, 
> and ConcurrentMarkSweepThread more so.  Pushing the shared code up 
> into ConcurrentGCThread but not using it in G1StringDedupThread and 
> ConcurrentMarkSweepThread seems confusing.
>
> There's a tension between providing a framework that handles all 
> shared factorizable code, but can become a straight jacket for future 
> code, and everyone doing everything separately and differently. This 
> webrev is somewhere in the middle. Some of the changes between 
> webrev.01 and .02 are to make the duplicated code more similar, even 
> though it's not shared.

I see. Thanks for investigating it!

I think I agree with Per, though. The value of ConcurrentServiceThread 
in its current form is IMHO not really worth the extra complexity of 
having it. I would prefer to just duplicate the code in 
ConcurrentG1RefineThread, ConcurrentMarkThread, and 
ConcurrentSampleThread for now and then have a separate change to try to 
clean this part up.

>
>>>> Naming. The naming in G1 is a bit inconsistent. Some files and 
>>>> classes are prefixed with G1 and some are not. But if they are 
>>>> called something with G1 it is normally a prefix. So, I would 
>>>> prefer the new classes to be called G1Concurrent* instead of 
>>>> ConcurrentG1*.
>>>
>>> So we have:
>>>     - ConcurrentG1RefineThread
>>>     - ConcurrentMarkThread
>>>
>>> And I added:
>>>     - ConcurrentG1SampleThread
>>>     - ConcurrentG1ServiceThread
>>>
>>> And maybe I'm removing ConcurrentG1ServiceThread. In that case I'd 
>>> be inclined to rename:
>>>      ConcurrentG1SampleThread => ConcurrentSampleThread 
>>
>> Sounds good. The ConcurrentG1Refine* classes are really the only 
>> oddly named G1 classes, so I think it is better not to let that 
>> naming spread.
> This version includes the class renaming. 

Thanks for fixing this.

If we do decide to keep ConcurrentServiceThread around I think it would 
be better to move ConcurrentSampleThread into its own file. It is a 
separate enough entity to warrant its own file I think.

>>
>>>> You write "and also fixes a P4 bug". Which bug is that?
>>> JDK-8136856 <https://bugs.openjdk.java.net/browse/JDK-8136856> G1 
>>> makes two concurrent refinement threads with 
>>> -XX:G1ConcRefinementThreads=1
>>> (because the sampling thread "is-a" concurrent refinement thread.
>>
>> Ah. I see. Makes sense. Thanks.
>>
>> But it is still not possible to turn refinement off by setting 
>> -XX:G1ConcRefinementThreads=0 since that is considered the default, 
>> right?
>
> I'm not sure about this. If I recall correctly, Thomas implied that it 
> was hard to disable concurrent refinement without disabling the 
> sampling thread too.

I'm thinking about this code in Arguments::set_g1_gc_flags():

   if (G1ConcRefinementThreads == 0) {
     FLAG_SET_DEFAULT(G1ConcRefinementThreads, ParallelGCThreads);
   }

Could we change that, so that you could turn off refinement by setting 
-XX:G1ConcRefinementThreads=0 ? It should probably be handled as a 
separate fix though.

Thanks,
Bengt

>
>>> I cant' recall how to mark a bug as blocking another bug.
>>
>> You add a link (More->Link) to the other bug and choose "block" or 
>> "is blocked by".
>>
>> Thanks,
>> Bengt
> Thanks for the tip!
>
> - Derek
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20151009/08ed586f/attachment.htm>


More information about the hotspot-gc-dev mailing list