[External] : Re: Ephemeral threads
Viktor Klang
viktor.klang at oracle.com
Mon Jan 12 11:53:11 UTC 2026
What I'm saying is that detecting, and debugging, such issues is vastly
more difficult when the forgotten thread has been GC:ed.
On 2026-01-12 12:31, Robert Engels wrote:
> No, just ensure that there is always a thread this will eventually
> call unpark().
>
> You can ensure this with proper use of try/finally.
>
> If you write that code any nothing ever calls unpark - it is hung (and
> leaked). You can resolve this without any new APIs.
>
> It has nothing to do with queues - it is all about correctness. It
> seems queues (or channels) has been discussed because this is a common
> source of this issue (especially in Go). See #2 here:
> https://oneuptime.com/blog/post/2026-01-07-go-goroutine-leaks/view
> <https://urldefense.com/v3/__https://oneuptime.com/blog/post/2026-01-07-go-goroutine-leaks/view__;!!ACWV5N9M2RV99hQ!Lc6RAKDcwT9pWlm7RR0zEh8Bw0kuCIHACWakPWcDKd89LJW1dwJMlK3Suc5v2grGe5E02hM6uJKJvH9m4PI$>
>
>> On Jan 12, 2026, at 4:00 AM, Viktor Klang <viktor.klang at oracle.com>
>> wrote:
>>
>>
>>
>> In my example there is no queue. Are you suggesting that all
>> pre-existing code and all new code should get rewritten using some
>> new API?
>>
>> On 2026-01-11 18:57, robert engels wrote:
>>> because if park wakes up, the thread already has a reference to the
>>> queue meaning it can start another thread that puts items into the
>>> queue. Meaning the queue is not “unreferenceable”, so you can’t
>>> simply destroy a thread waiting in park().
>>>
>>>> On Jan 11, 2026, at 10:30 AM, Viktor Klang
>>>> <viktor.klang at oracle.com> wrote:
>>>>
>>>>
>>>>
>>>> >This code is fundamentally broken. Park() can wake up for any reason.
>>>>
>>>> I don't see how "When park wakes up" (i.e. the temporal aspect)
>>>> affects correctness in any way in the example given.
>>>>
>>>> >I suggest you look at ClosableQueue - it is correct and far easier
>>>> to use.
>>>>
>>>> The example is completely devoid of any queuing concerns. We're
>>>> talking about logic which is executed by some thread, and the
>>>> person who writes the code does not strictly know whether that
>>>> thread is a platform thread, a pooled platform thread, a virtual
>>>> thread, an ephemeral virtual thread, a GC finalizer thread.
>>>>
>>>> In short, this is about: pre-existing code which may get executed
>>>> by an ephemeral virtual thread may /silently/ leak resources under
>>>> certain circumstances. Now, it can be argued that most of that code
>>>> was "not ideal" in the first place, but the big difference is that
>>>> when any such defect gets noticed in a running application, there's
>>>> a much better visibility if the thread which ran into the problem
>>>> is still there (evidence) vs not (no evidence).
>>>>
>>>> On 2026-01-11 01:50, Robert Engels wrote:
>>>>> This code is fundamentally broken. Park() can wake up for any reason.
>>>>>
>>>>> I suggest you look at ClosableQueue - it is correct and far easier
>>>>> to use.
>>>>>
>>>>>> On Jan 10, 2026, at 6:03 PM, Viktor Klang
>>>>>> <viktor.klang at oracle.com> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> Hi Dmitry,
>>>>>>
>>>>>> An example can look like:
>>>>>>
>>>>>> void method() {
>>>>>> long fileDescriptor = acquireFileDescriptor();
>>>>>> LockSupport.park();
>>>>>> releaseFileDescriptor(fileDescriptor);
>>>>>> }
>>>>>>
>>>>>> If an ephemeral VT executes that method, and there are no other
>>>>>> references to that ephemeral VT, then at the point of park(),
>>>>>> nothing can unpark it anymore, and it will then never release the
>>>>>> file descriptor.
>>>>>>
>>>>>>
>>>>>> >We generally don’t allow try blocks (providing other
>>>>>> constructs), we also very strongly discourage (just a drop short
>>>>>> of disallowing) ANY threading primitives.
>>>>>>
>>>>>>
>>>>>> I don't see how that can work in practice, because it requires
>>>>>> all users of your constructs to be familiar about exactly how all
>>>>>> third-party logic (including JDK classes) are implemented under
>>>>>> the hood. Perhaps I'm misunderstanding?
>>>>>>
>>>>>> On 2026-01-09 17:27, Dmitry Zaslavsky wrote:
>>>>>>> Not sure what you mean by native resources?
>>>>>>> Do you mean what people would use like try resources?
>>>>>>> We generally don’t allow try blocks (providing other constructs), we also very strongly discourage (just a drop short of disallowing) ANY threading primitives.
>>>>>>>
>>>>>>> Which makes me think that there is a better way to express my point from before.
>>>>>>> I think there is actually a common pattern here.
>>>>>>>
>>>>>>> We use VT inside of the lib. We don’t want users to actually use any threads all.
>>>>>>> I think it’s a goal of Alex as well.
>>>>>>> We use VT as a way to avoid using threads (if that makes sense).
>>>>>>>
>>>>>>> I think ScopedTasks is going in the same direction. Ideally user just doesn’t know there are threads.
>>>>>>> We use Scala (appealing to Victor ;)) vals and immutable collections is the norm.
>>>>>>>
>>>>>>> We don’t want users to think about Threads period.
>>>>>>> So the thought of "GC roots on a VT … we don’t want that though to ever occur or we failed ;)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On Jan 9, 2026, at 10:26 AM, Viktor Klang<viktor.klang at oracle.com> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 2026-01-09 15:39, Dmitry Zaslavsky wrote:
>>>>>>>>> someCollection.apar.map { …. }
>>>>>>>>> Can spin N tasks (Each can get it's VT) If some iteration of the loop throws, we don’t need to rest of the code to run, it’s costly.
>>>>>>>>> If the task are not actively mounted but previously started and are waiting… (in our case it’s LockSupport.park) we just want to drop that entire queue and everything around it….
>>>>>>>>>
>>>>>>>>>
>>>>>>>> How do you handle acquired native resources that are yet to be released?
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Cheers,
>>>>>>>> √
>>>>>>>>
>>>>>>>>
>>>>>>>> Viktor Klang
>>>>>>>> Software Architect, Java Platform Group
>>>>>>>> Oracle
>>>>>>>>
>>>>>> --
>>>>>> Cheers,
>>>>>> √
>>>>>>
>>>>>>
>>>>>> Viktor Klang
>>>>>> Software Architect, Java Platform Group
>>>>>> Oracle
>>>> --
>>>> Cheers,
>>>> √
>>>>
>>>>
>>>> Viktor Klang
>>>> Software Architect, Java Platform Group
>>>> Oracle
>> --
>> Cheers,
>> √
>>
>>
>> Viktor Klang
>> Software Architect, Java Platform Group
>> Oracle
--
Cheers,
√
Viktor Klang
Software Architect, Java Platform Group
Oracle
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/loom-dev/attachments/20260112/16b13a16/attachment.htm>
More information about the loom-dev
mailing list