RFR: 8138920: Refactor the sampling thread from ConcurrentG1RefineThread
Derek White
derek.white at oracle.com
Wed Oct 7 15:19:59 UTC 2015
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.
> 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.
> 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
> 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.
I cant' recall how to mark a bug as blocking another bug.
>
> In ConcurrentG1SampleThread::sample_young_list_rs_lengths() you copied
> the code that does:
>
> if (g1p->adaptive_young_list_length()) {
>
> As far as I can tell this is always true, since the value for
> adaptive_young_list_length() stems from
> G1YoungGenSizer::_adaptive_size, which only seems to be set in the
> constructor:
>
> G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults),
> _adaptive_size(true)
>
> Maybe this should be fixed separately, but it looks like it should be
> cleaned up.
Ignored as requested.
Thanks Bengt!
- Derek
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20151007/97eb543f/attachment.htm>
More information about the hotspot-gc-dev
mailing list