You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by "Dmitri Blinov (JIRA)" <ji...@apache.org> on 2015/09/29 15:01:04 UTC

[jira] [Commented] (LOG4J2-1125) Reuse StringBuilder to improve performance for PatternLayout

    [ https://issues.apache.org/jira/browse/LOG4J2-1125?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14935125#comment-14935125 ] 

Dmitri Blinov commented on LOG4J2-1125:
---------------------------------------

I just noticed that tomcat-7 complains that newly introduced ThreadLocal in 2.4 is not cleaned after web application is being redeployed.

Here is quote from catalina.out
{quote}
SEVERE: The web application created a ThreadLocal with key of type \[org.apache.logging.log4j.core.layout.PatternLayout$1] (value \[org.apache.logging.log4j.core.layout.PatternLayout$1@a6bbbd5]) and a value of type \[java.lang.StringBuilder] (value \[\[2015-09-29 15:00:07,233] \[TRACE] \[http-bio-8080-exec-694]: SessionLogger.close: Closing logging context: fx.beta.088F520330A8EB3C604AED2E36D0F811
]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
{quote}

I think it's very serious and needs to be fixed

> Reuse StringBuilder to improve performance for PatternLayout
> ------------------------------------------------------------
>
>                 Key: LOG4J2-1125
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1125
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: Layouts
>    Affects Versions: 2.3
>            Reporter: Remko Popma
>            Assignee: Remko Popma
>             Fix For: 2.4
>
>
> As part of the investigation for LOG4J2-930 (PatternLayout performance), I found that in PatternLayout.toSerializable(), instead of creating a new StringBuilder each time this method is called, caching and reusing a ThreadLocal<StringBuilder> makes a huge difference in performance.
> *Before (new StringBuilder instance for each event)*
> {code}
> Benchmark                                                 Mode  Samples     Score    Error  Units
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2     sample   125646  1413.362 ± 33.806  ns/op
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback    sample   128680  1383.201 ± 33.076  ns/op
> {code}
> *After (reuse ThreadLocal<StringBuilder>)*
> {code}
> Benchmark                                                 Mode  Samples     Score    Error  Units
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.log4j2     sample   156816  1138.547 ± 20.290  ns/op
> o.a.l.l.p.j.PatternLayoutComparisonBenchmark.logback    sample   127978  1355.166 ± 19.462  ns/op
> {code}
> org.apache.logging.log4j.PerformanceComparison results indicate this improves overall performance:
> *Before (new StringBuilder instance for each event)*
> {code}
> Log4j    : 1501
> Logback  : 1208
> Log4j 2.0: 1646
> ###############################################
> Log4j    : 1487
> Logback  : 1165
> Log4j 2.0: 1566
> ###############################################
> Log4j    : 1490
> Logback  : 1170
> Log4j 2.0: 1485
> ###############################################
> Log4j    : 1392
> Logback  : 1143
> Log4j 2.0: 1629
> {code}
> *After (reuse ThreadLocal<StringBuilder>)*
> {code}
> Log4j    : 1498
> Logback  : 1202
> Log4j 2.0: 1213
> ###############################################
> Log4j    : 1394
> Logback  : 1057
> Log4j 2.0: 1290
> ###############################################
> Log4j    : 1240
> Logback  : 1109
> Log4j 2.0: 1335
> ###############################################
> Log4j    : 1310
> Logback  : 1146
> Log4j 2.0: 1210
> {code}
> There are more changes for LOG4J2-930, so I am splitting off this item into a separate ticket so I can address it and close it.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org