On Mon, Dec 30, 2019 at 10:15 PM Carter Kozak <cko...@ckozak.net> wrote: > Beyond StringBuilder instances, we attempt to clear references > from all thread local references to avoid substantial overhead. In > practice this works nicely because it reinforces java performance > characteristics. Java threads are fairly memory expensive (not to > mention the cost of initialization) so the threadlocal object overhead > from log4j tends to be inconsequential by comparison. Applications > in memory constrained environments already have relatively few > threads, and applications which constantly create and destroy threads > tend not to worry about the performance of creating log events > because it's inexpensive compared to thread initialization. > > Have you observed a problem? We've found and resolved a few issues > over the last year or so where references were held longer than > expected. If you're aware of places we're using more memory than we > should, please file a ticket :-)
AFAIC, the only TLA in Log4j 2.0 core violating log4j2.enableThreadlocals flag is AbstractStringLayout#getStringBuilder(). Given AbstractStringLayout is used by many internal (HTML, XML, JSON, YAML, Pattern, Gelf, Syslog) and external (ECS) layouts, the fix will incur a significant performance penalty. I wouldn't be surprised if we start receiving performance regression bug reports from users after releasing such a fix, since a notable amount of Log4j 2.0 users, to the best of my knowledge, are using it in JEE context (e.g., Spring WebMvc with Tomcat backend) where ENABLE_THREADLOCALS are disabled due to the present IS_WEB_APP condition: o.a.l.l.u.Constants.ENABLE_THREADLOCALS = !IS_WEB_APP && PropertiesUtil .getProperties() .getBooleanProperty("log4j2.enable.threadlocals", true); Created LOG4J2-2753[1] for this issue. The reason I started the discussion is, in log4j2-logstash-layout, I am aiming for the fastest approach, always. The performance comparison is JMH-driven, where all competitors (LogstashLayout, EcsLayout, JsonLayout, etc.) are fine tuned for fairness. There I try to play fair, but neither Log4j 2.0 JsonLayout, nor EcsLayout of Elastic does that; they perform TLA without taking log4j2.enableThreadlocals flag into account. This leads me to questionthe presence of such a flag in the first place. Why don't we just remove the log4j2.enableThreadlocals flag? What are its use cases? [1] https://issues.apache.org/jira/browse/LOG4J2-2753