Great, thanks for the explanation! I can't wait to use this set-up in production.
On 18 April 2016 at 17:48, Remko Popma <remko.po...@gmail.com> wrote: > Yes, in that case the threadpool doesn't outlive the application so > there's no chance of memory leaks. > > Not sure if Tomcat also can be configured to have separate threadpools per > web app and to refresh the thread pool on web app undeploy/redeploy. > > Sent from my iPhone > > On 2016/04/19, at 3:27, Matt Sicker <boa...@gmail.com> wrote: > > But would you say it's safe to use ThreadLocal when you don't undeploy or > redeploy web apps? Like if you always restart Tomcat when you redeploy, > would it be safe to use ThreadLocal in such a scenario? > > On 18 April 2016 at 09:49, Remko Popma <remko.po...@gmail.com> wrote: > >> The problem is that values stored in ThreadLocals may live longer than >> the web application since the threads that hold these values are in a pool >> and the threads live on after the web application is undeployed. If the >> value is a JDK class this is not a problem. >> >> If the value is a class that is defined in your webapp (or a library of >> the web app) then holding on the the value means the class cannot be >> garbage-collected. And voila, we have a memory leak... >> >> Garbage-free logging makes liberal use of ThreadLocals with non-JDK >> values. If the web container separates the thread pools between >> applications and restarts the thread pool with the web application, the >> above memory leak does not occur. (I believe this is what WebSphere does.) >> >> Eventually we may be able to address this with LOG4J2-1116 >> <https://issues.apache.org/jira/browse/LOG4J2-1116>. >> >> >> >> On Mon, Apr 18, 2016 at 11:04 PM, Matt Sicker <boa...@gmail.com> wrote: >> >>> So is this only bad to use when you have multiple wars on a single >>> Tomcat, or is it bad for when you try to undeploy, or is there another >>> issue here? >>> >>> On 18 April 2016 at 09:01, Remko Popma <remko.po...@gmail.com> wrote: >>> >>>> Yes but if this is wrong because there is no threadpool or so, then you >>>> can use System property "log4j2.is.webapp" to tell Log4j that it >>>> should consider your app a non-webapp. >>>> >>>> On Mon, Apr 18, 2016 at 10:59 PM, Matt Sicker <boa...@gmail.com> wrote: >>>> >>>>> Would an embedded Tomcat/Jetty a la Spring Boot really be considered a >>>>> web application? >>>>> >>>>> On 18 April 2016 at 08:56, Remko Popma <remko.po...@gmail.com> wrote: >>>>> >>>>>> When I finish performance testing I will add graphs to the >>>>>> Performance section of the gc-free manual page so that users can make an >>>>>> informed decision. (The below one is an example.) >>>>>> >>>>>> So far, it seems that even with the garbage-free logging enabled, >>>>>> synchronous logging throughput (the green line) is usually slightly >>>>>> faster >>>>>> than it was with 2.5 (the purple line). So I think making garbage-free >>>>>> the >>>>>> default is acceptable. Also, users who care about logging throughput will >>>>>> be logging asynchronously, not synchronously: this scales much better >>>>>> with >>>>>> the number of application threads. >>>>>> >>>>>> >>>>>> <ThroughputSyncLinux.png> >>>>>> >>>>>> >>>>>> On Mon, Apr 18, 2016 at 9:57 PM, Mikael Ståldal < >>>>>> mikael.stal...@magine.com> wrote: >>>>>> >>>>>>> Is it wise to enable by default given that "multi-threaded >>>>>>> applications that use synchronous logging may see worse performance"? >>>>>>> >>>>>>> On Mon, Apr 18, 2016 at 2:22 PM, Remko Popma <remko.po...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Enabled, except for web apps; for those log4j will be low garbage. >>>>>>>> >>>>>>>> See the first paragraph of the Configuration section in the manual >>>>>>>> page. >>>>>>>> >>>>>>>> Please let me know if this is not clear. (The fact that you asked >>>>>>>> means this probably needs improvement...) >>>>>>>> >>>>>>>> Sent from my iPhone >>>>>>>> >>>>>>>> On 2016/04/18, at 20:18, Mikael Ståldal <mikael.stal...@magine.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Will garbage-free logging be enabled or disabled by default? >>>>>>>> >>>>>>>> On Mon, Apr 18, 2016 at 2:58 AM, Remko Popma (JIRA) < >>>>>>>> j...@apache.org> wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> [ >>>>>>>>> https://issues.apache.org/jira/browse/LOG4J2-1297?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15245018#comment-15245018 >>>>>>>>> ] >>>>>>>>> >>>>>>>>> Remko Popma commented on LOG4J2-1297: >>>>>>>>> ------------------------------------- >>>>>>>>> >>>>>>>>> TODO allocate many temporary objects -> allocate temporary objects >>>>>>>>> >>>>>>>>> TODO multi-threaded applications that use synchronous logging may >>>>>>>>> see worse performance: the lock that was previously only around the IO >>>>>>>>> operation is widened to include the text formatting and conversion to >>>>>>>>> bytes. -> _synchronous_ logging performance may be worse for >>>>>>>>> multi-threaded >>>>>>>>> applications in this mode due to synchronization on the shared >>>>>>>>> buffer. If >>>>>>>>> your application is multi-threaded and logging performance is >>>>>>>>> important, >>>>>>>>> consider using Async Loggers. >>>>>>>>> >>>>>>>>> TODO Caution: Only dates in the predefined formats are >>>>>>>>> garbage-free -> Caution: Only the predefined date formats are >>>>>>>>> garbage-free >>>>>>>>> >>>>>>>>> TODO "(Note that Log4j may call toString() on message and >>>>>>>>> parameter objects when garbage-free logging is disabled because system >>>>>>>>> property log4j2.enable.threadlocals is set to "false".)" -> Log4j may >>>>>>>>> call >>>>>>>>> toString() on message and parameter objects when garbage-free logging >>>>>>>>> is >>>>>>>>> disabled (when system property log4j2.enable.threadlocals is set to >>>>>>>>> "false".) >>>>>>>>> >>>>>>>>> TODO "made an effort to make logging code garbage-free" -> "made >>>>>>>>> an effort to make logging garbage-free" >>>>>>>>> >>>>>>>>> >>>>>>>>> > Document "gc-free" configuration and performance >>>>>>>>> > ------------------------------------------------ >>>>>>>>> > >>>>>>>>> > Key: LOG4J2-1297 >>>>>>>>> > URL: >>>>>>>>> https://issues.apache.org/jira/browse/LOG4J2-1297 >>>>>>>>> > Project: Log4j 2 >>>>>>>>> > Issue Type: New Feature >>>>>>>>> > Components: Documentation >>>>>>>>> > Affects Versions: 2.5 >>>>>>>>> > Reporter: Remko Popma >>>>>>>>> > Assignee: Remko Popma >>>>>>>>> > Fix For: 2.6 >>>>>>>>> > >>>>>>>>> > Attachments: log4j-2.5-FlightRecording.png, >>>>>>>>> log4j-2.6-FlightRecording.png >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > Update the site with a description of which configurations are >>>>>>>>> GC-free (i.e., that don't create temporary objects in steady running >>>>>>>>> state). >>>>>>>>> > Currently that means >>>>>>>>> > * Loggers are all asynchronous (Log4jContextSelector is set to >>>>>>>>> org.apache.logging.log4j.core.async.AsyncLoggerContextSelector). >>>>>>>>> > * The configuration does not contain a <Properties> section. >>>>>>>>> > * The "steady-state" appenders are either RandomAccessFile or >>>>>>>>> RollingRandomAccessFile Appenders (logging to any other appender will >>>>>>>>> cause >>>>>>>>> temporary objects to be created - including ConsoleAppender). >>>>>>>>> > * The Layout is a PatternLayout that uses one of the pre-defined >>>>>>>>> date formats, does not have any regular expression replacements, and >>>>>>>>> does >>>>>>>>> not have lookups (TODO: may need to restrict this further). >>>>>>>>> > * The thread name is cached (this is the [default| >>>>>>>>> https://issues.apache.org/jira/browse/LOG4J2-467]). Running with >>>>>>>>> -DAsyncLogger.ThreadNameStrategy=UNCACHED will create garbage. >>>>>>>>> > * In user code, when logging a parameterized message, the number >>>>>>>>> of parameters is no more than ... (TBD pending discussion in >>>>>>>>> LOG4J2-1278). >>>>>>>>> > * In user code, when logging a parameterized message, parameters >>>>>>>>> of primitive type are boxed in a reused StringBuilder (Log4j provides >>>>>>>>> a >>>>>>>>> utility to make this relatively painless). >>>>>>>>> > Even with the above restrictions, Log4j may occasionally create >>>>>>>>> garbage: >>>>>>>>> > * Initially StringBuilders are presized to 128 characters. They >>>>>>>>> may grow for larger messages (contributing to garbage in Old Gen). If >>>>>>>>> the >>>>>>>>> StringBuilder grows beyond 512 characters it is trimmed back to 512 >>>>>>>>> characters to prevent memory leaks from excessively long messages. >>>>>>>>> (TODO: >>>>>>>>> the resizing algorithm is {{size = value.length * 2 + 2}}, so a better >>>>>>>>> cutoff value is 518.) >>>>>>>>> > * Messages containing {{"$\{"}} will be converted to a String >>>>>>>>> and StrSubstitutor will be used to replace occurences of variables >>>>>>>>> with >>>>>>>>> their matching values. Multiple temporary objects are created during >>>>>>>>> this >>>>>>>>> process. >>>>>>>>> > Furthermore, we need to explain that some of this functionality >>>>>>>>> depends on ThreadLocals and so is disabled by default in web >>>>>>>>> applications >>>>>>>>> to prevent memory leaks. The page should also explain how to manually >>>>>>>>> switch off the use of ThreadLocals. >>>>>>>>> > Finally, the page should show a performance test comparison >>>>>>>>> similar to the [performance section| >>>>>>>>> http://logging.apache.org/log4j/2.x/manual/async.html#Performance] >>>>>>>>> on the Async Loggers page. I'm thinking a comparison between Logback, >>>>>>>>> Log4j-1, Log4j-2.0, Log4j-2.6 "classic" and Log4j-2.6 "gc-free" would >>>>>>>>> be >>>>>>>>> ideal. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> This message was sent by Atlassian JIRA >>>>>>>>> (v6.3.4#6332) >>>>>>>>> >>>>>>>>> >>>>>>>>> --------------------------------------------------------------------- >>>>>>>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org >>>>>>>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> [image: MagineTV] >>>>>>>> >>>>>>>> *Mikael Ståldal* >>>>>>>> Senior software developer >>>>>>>> >>>>>>>> *Magine TV* >>>>>>>> mikael.stal...@magine.com >>>>>>>> Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com >>>>>>>> >>>>>>>> Privileged and/or Confidential Information may be contained in this >>>>>>>> message. If you are not the addressee indicated in this message >>>>>>>> (or responsible for delivery of the message to such a person), you >>>>>>>> may not copy or deliver this message to anyone. In such case, >>>>>>>> you should destroy this message and kindly notify the sender by >>>>>>>> reply email. >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> [image: MagineTV] >>>>>>> >>>>>>> *Mikael Ståldal* >>>>>>> Senior software developer >>>>>>> >>>>>>> *Magine TV* >>>>>>> mikael.stal...@magine.com >>>>>>> Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com >>>>>>> >>>>>>> Privileged and/or Confidential Information may be contained in this >>>>>>> message. If you are not the addressee indicated in this message >>>>>>> (or responsible for delivery of the message to such a person), you >>>>>>> may not copy or deliver this message to anyone. In such case, >>>>>>> you should destroy this message and kindly notify the sender by >>>>>>> reply email. >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Matt Sicker <boa...@gmail.com> >>>>> >>>> >>>> >>> >>> >>> -- >>> Matt Sicker <boa...@gmail.com> >>> >> >> > > > -- > Matt Sicker <boa...@gmail.com> > > -- Matt Sicker <boa...@gmail.com>