[External] : Re: Virtual thread memory leak because TrackingRootContainer keeps threads

Robert Engels robaho at icloud.com
Tue Jul 9 15:43:00 UTC 2024


As an aside, that seems like a much more complicated and obscure design than using closable queues.

> On Jul 9, 2024, at 10:24 AM, Michal Domagala <outsider404 at gmail.com> wrote:
> 
> Indeed, for 25+ years thread is GC root.
> But for 3+ years virtual threads are present and they are documented as ephemeral.
> Developers are used to alive threads and virtual, alive threads are not confusing. But virtual, alive threads documented as ephemeral are confusing.
> Moreover, the idea that VT from Executors API is GCed but from Thread API not looks inconsistent. But it is low confusion. Working against documentation is high confusion.
> 
> Let's consider my case. I take 1000 Kafka events for concrete people each poll. 90% of events are ignored (not my customers), 10% are processed (my customers), but each event must be acked.
> Each customer has a blocking queue. 10% is distributed to proper queues. Each queue has a VT, which processes the event and finally ack the event.
> From time to time customers are off. Their blocking queues are thrown away. 
> There is a chance that at the same moment the customer is off, new poll come with customer events. Kafka listener put event to customer queue and expects VT will ack the event.
> VT can't be stopped by the "customer-off" process, because new events may come to the blocking queue anytime.
> 
> Race can be solved without synchronization. GC "knows" when the blocking queue is not visible by Kafka listener thread and "stops" the VT by reclaiming its resources.
> 
> I hope this example is clear enough to see that reclaiming VT resources by GC is simple and automatic when manual solution requires thread synchronization and is prone to errors.
> 
> wt., 9 lip 2024 o 16:24 Alan Bateman <Alan.Bateman at oracle.com <mailto:Alan.Bateman at oracle.com>> napisał(a):
> On 09/07/2024 12:51, Michal Domagala wrote:
> > Thanks for valuable observability context
> >
> > As I understand, initially VT created by Thread API was not observable 
> > in thread dump and VT created by Executors API was observable. It was 
> > confusing and now both kinds of VT are observable. Make sense.
> > But observability is reached by strong reference. VT created by Thread 
> > API are strongly referenced until stop and not GC'ed until stop and VT 
> > created by Executors API are not referenced at all and GC'ed when not 
> > reachable, regardless of being stopped or not. That's not OK and much 
> > worse than previous confusion.
> 
> An ExecutorService implementation has to keep a reference to each 
> task/thread because of the shutdownNow and close method. There are other 
> thread groupings that arise when using structured concurrency that 
> require a thread executing a main task wait for threads executing 
> subtasks to finish executing.
> 
> As things stand I don't expect there will be much confusion. For 25+ 
> years, a started thread is alive (and strongly reachable) until it 
> terminates. Having virtual thread work mostly the same shouldn't be a 
> surprise. As I said, the door hasn't been closed on introducing some 
> notion of ephemeral thread in the future. It's not really feasible right 
> now because of finalization and because of several issues related to 
> cleaner actions and explicit APIs to keep some object reachable until a 
> thread gets to some point in its execution. So there is more to this 
> than just observability (and yes of course observability could traverse 
> other reference types if needed).
> 
> As regards the thread counting in the root container when running with 
> the undocumented system property jdk.trackAllThreads is set to false. 
> That is the count of the live (started but not terminated) threads in 
> that thread grouping. It is a left over from when we will mulling over 
> what the right default should be (reporting a thread count when you 
> can't list the threads has some value).
> 
> -Alan

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/loom-dev/attachments/20240709/5bf27ecd/attachment-0001.htm>


More information about the loom-dev mailing list