[
https://issues.apache.org/jira/browse/LOG4J2-3622?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17628991#comment-17628991
]
Volkan Yazici commented on LOG4J2-3622:
---------------------------------------
Let's break this issue down a bit.
h1. TL usage in Log4j
Log4j uses thread locals (TLs) for two main purposes:
# efficiency (via caching)
# associating data with a thread (MDC, NDC, etc.)
h1. JEP 425 (Virtual Threads)
With JEP 425 TLs become problematic due to two main reasons:
# TLs on vthreads yield no allocation benefits since vhtreads are short-lived.
On the contrary, it becomes a redundant memory cost due to the excessive
vthread count. In this case, Log4j still works, though slower and with
increased memory footprint.
# TL mutation can be disabled for _both_ platform and virtual threads. In this
case, Log4j doesn't work, since TL access throws
{{{}UnsupportedOperationException{}}}.
h1. JEP 429 (Scoped Values)
SVs provided with JEP 429 solves the problem of associating data with a thread
(MDC, NDC, etc.) and solves it simply better.
h1. Where are we now?
* JEP 425 (Virtual Threads) has been released as a _preview_ feature in Java
19. There TL kill-switch is introduced and it is set to {{false}} by default.
* JEP 429 (Scoped Values) doesn't have any EA releases yet
* Log4j has many TL usages
h1. The (personal) conclusion
Given the current state of Log4j and Java, I don't agree with the claim of this
ticket that {_}Log4j doesn't work with virtual threads{_}.
* Log4j, or any other library in the wild that uses TLs, works in a vthread
setting. It just allocates redundant memory and runs slower.
* Setting {{disableThreadLocals=true}} and expecting Log4j to work is no
different than disabling your WiFi and expecting your browser to work.
*However,* we all agree that TLs are not a good fit for caching purposes and
cause performance regressions with vthreads. To work around this, replacing the
caching-related TL usages with the aforementioned {{Recycler}} abstraction
(used in {{{}JsonTemplateLayout{}}}) can be a way forward. Though it better be
addressed in another ticket with a more clear-cut scope: _"Replacing
caching-related thread-locals"_
How to replace the TLs used for associating data with a thread is still an
unanswered question thought. [~ckozak] and I got in touch with Loom developers
(see _"Thread-local successor for object pooling"_ threads in
[October|https://mail.openjdk.org/pipermail/loom-dev/2022-October/thread.html]
and
[November|https://mail.openjdk.org/pipermail/loom-dev/2022-November/thread.html])
to see what would be a future-proof way to implement this. As far as I am
concerned, {{disableThreadLocals}} kill-switch is still a subject of discussion
(nothing concrete yet) and SVs are not there either. Hence, there is still too
much unclarity to make any commitments yet.
> Support for virtual threads
> ---------------------------
>
> Key: LOG4J2-3622
> URL: https://issues.apache.org/jira/browse/LOG4J2-3622
> Project: Log4j 2
> Issue Type: Bug
> Components: Core
> Reporter: liuxichen
> Priority: Critical
>
> I noticed in ReusableMessageFactory threadlocal are used, so If a am using
> jdk19 virtual threads while logging with threadlocal disabled,
> UnsupportedOperationException would be thrown, and using log in a lot of
> virtual threads might create a lot of useless objects, could you please fix
> this?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)