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

Carter Kozak commented on LOG4J2-2675:
--------------------------------------

Tracking this in https://issues.apache.org/jira/browse/LOG4J2-2391 though 
unfortunately I've been busy lately and haven't had a great deal of time to 
devote to it.
There's a workaround, if you don't mind losing jar information: 
https://issues.apache.org/jira/browse/LOG4J2-2391?focusedCommentId=16668846&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-16668846

 

We've discussed adding a cache, but there are subtle gotchas involving shared 
environments with child classloaders loading different classes with the same 
fully qualified name. Producing an incorrect source jar in the logs would lead 
to a great deal of unnecessary confusion, however that wouldn't be the case for 
generated classes. Unfortunately, some workflows create unbounded proxies, 
which we would need to handle gracefully.

> Performance issue with stack traces containing generated classes
> ----------------------------------------------------------------
>
>                 Key: LOG4J2-2675
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2675
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.12.1
>            Reporter: Ryan Schmitt
>            Priority: Major
>
> We've noticed a performance problem with stack traces that contain certain 
> types of generated classes. For example:
> {noformat}
> 16 Aug 2019 15:54:33,470 [INFO]  (main) com.example.LoggingIntegrationTest: 
> Exception thrown
> java.lang.reflect.InvocationTargetException: null
>       at 
> jdk.internal.reflect.GeneratedConstructorAccessor10.newInstance(Unknown 
> Source) ~[?:?]
>       at 
> jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>  ~[?:?]
>       at java.lang.reflect.Constructor.newInstance(Constructor.java:490) 
> ~[?:?]
>       at 
> com.example.LoggingIntegrationTest.construct(LoggingIntegrationTest.java:25) 
> ~[classes/:?]
> {noformat}
> In this example, {{jdk.internal.reflect.GeneratedConstructorAccessor10}} is a 
> class generated by the JDK in order to optimize the reflective 
> {{Constructor#newInstance}} call. One quirk of these classes (called 
> "inflated constructors" within the JDK) is that [they get loaded in their 
> very own 
> classloader|https://github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/sun/reflect/ClassDefiner.java#L39-L65].
>  Since Log4j2 has no hope of finding this classloader, it also cannot 
> [resolve the class name to a Class 
> object|https://github.com/apache/logging-log4j2/blob/de6593f5f3b5acbb2cdb4ee91e4e1f472db5dcbb/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java#L197-L233]
>  in {{ThrowableProxyHelper#loadClass}}. This means that every stack trace 
> containing such a class, when it is rendered, will cause the entire classpath 
> to be scanned.
> It seems that {{ThrowableProxyHelper}} should have some sort of negative 
> caching in order to optimize this case.



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to