RFR: 8201318: Introduce GCThreadLocalData to abstract GC-specific data belonging to a thread

Aleksey Shipilev shade at redhat.com
Wed Apr 11 10:13:55 UTC 2018


On 04/11/2018 11:54 AM, Per Liden wrote:
>> *) Should these new methods accept JavaThread*? I.e. we are expecting the GC thread-local data only
>> for JavaThreads, like attach/detach does?
>>
>>     virtual void on_thread_create(Thread* thread);
>>     virtual void on_thread_destroy(Thread* thread);
>>     virtual void on_thread_attach(JavaThread* thread);
>>     virtual void on_thread_detach(JavaThread* thread);
> 
> The intention is that on_thread_create/destroy is called for all threads, where as
> on_thread_attach/detach is only called for JavaThreads (i.e. threads that are added to the "threads
> list"). There's been discussions about treating all threads in the same way, i.e. they would all be
> on the threads list and they would all receive attach/detach calls. It's not clear yet if that is a
> good idea, but if that change is made in the future, then we might want to revisit this interface.

Ah, I understand. After sending the reply yesterday I realized they might be legit use cases where
you want to have GCTLD available e.g. for GC threads.

> As discussed else where in this thread, the reason for keeping the GCThreadLocalData member early in
> Thread is to allow GC barriers to generate compact code. As Erik indicates, this may not matter that
> much in the end, but I also don't think it hurts to let it sit there.
> 
> Also, I've shrunk GCThreadLocalData to 112 bytes, which is what G1 currently needs. ZGC currently
> uses 156 bytes (IIRC), but that's a change that should stay the ZGC repo for now.

Oh. Haven't expected we need that much. This makes me think if we should implement some sort of
STATIC_ASSERT-based overflow checks? Not necessarily in this RFE.

> Updated webrev here:
> 
> Diff: http://cr.openjdk.java.net/~pliden/8201318/webrev.1vs2/
> Full: http://cr.openjdk.java.net/~pliden/8201318/webrev.2/

Looks good!

Minor nits (no need to re-review):

*) I'll probably do another sweep and do a tad better indenting work. Compare:

2178   Address in_progress(Rthread, in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()));
2179   Address index(Rthread, in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset()));
2180   Address buffer(Rthread, in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset()));

vs.

2178   Address in_progress(Rthread, in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()));
2179   Address       index(Rthread, in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset()));
2180   Address      buffer(Rthread, in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset()));

*) Typos: "provied" -> "provided", "over head" -> "overhead".

 // Thread local data area for GC-specific information. Each GC
 // is free to decide the internal structure and contents of this
 // area. It is represented as a 64-bit aligned opaque blob to
 // avoid circular dependencies between Thread and all GCs. For
 // the same reason, the size of the data area is hard coded to
 // provied enough space for all current GCs. Adjust the size if
 // needed, but avoid making it excessively large as it adds to
 // the memory over head of creating a thread

*) Also mention the choice of <128 bytes? Like this:

 // The size of GCTLD is kept under 128 bytes to let compilers encode
 // accesses to GCTLD members with short offsets from the Thread.


-Aleksey


More information about the hotspot-dev mailing list