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

ASF GitHub Bot commented on LOG4J2-2389:
----------------------------------------

Github user liuwenchn commented on the issue:

    https://github.com/apache/logging-log4j2/pull/195
  
    hi  garydgregory, 
          thanks for your reply. We  have thought about what you said. 
     - The main ideas and standpoints are as follows: 
        - Each item in our map corresponds to a class, so the total number of 
items in the map must not exceed the total number of classes loaded.
        - And then for each item, we have a very small amount of data in there, 
extendedClassInfo, just a few fields.
        - A class, which has everything in memory that contains all the 
information about the class. Each item in our map takes up much less memory 
than its corresponding class.
        - In my benchmarking test 
[result,](https://github.com/liuwenchn/log4j2-throwableproxy-benchmark/) when 
make the cache global, about 2 times further improvement than the version of 
just fixing bug in ThrowableProxy accessing the cache.
    - Weighing the pros and cons, we we think that the map should be global


> fix the CacheEntry map in ThrowableProxy#toExtendedStackTrace to be put and 
> gotten with same key and  make the cache entry map be global
> ----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-2389
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2389
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.6.2, 2.7, 2.8, 2.8.1, 2.8.2, 2.9.0, 2.9.1, 2.10.0, 
> 2.11.0
>            Reporter: LIU WEN
>            Priority: Major
>
> * fix the CacheEntry map in ThrowableProxy#toExtendedStackTrace to be put and 
> gotten with same key
>  * stackTraceElement.toString() returns a string representation of this stack 
> trace element, just as MyClass.mash(MyClass.java)
>  * stackTraceElement.getClassName() returns the fully qualified name of the 
> Class, just as org.apache.logging.log4j.MyClass
> {code:java}
> final String className = stackTraceElement.getClassName();
> ……
> final CacheEntry cacheEntry = map.get(className);
> if (cacheEntry != null) {
>       final CacheEntry entry = cacheEntry;
>       extClassInfo = entry.element;
>       if (entry.loader != null) {
>              lastLoader = entry.loader;
>       }
> } else {
>       final CacheEntry entry = this.toCacheEntry(stackTraceElement,
>       this.loadClass(lastLoader, className), false);
>       extClassInfo = entry.element;
>       map.put(stackTraceElement.toString(), entry);
>       if (entry.loader != null) {
>              lastLoader = entry.loader;
>       }
> }
> {code}
>  - The main impact of the problem was that it would increase of frequency of 
> loading classes ,which led to the execution of the program be slow down, 
> because of the synchronization mechanism in the method loadClass
>  - In addition to fixing the problem, I think cache map could be made global, 
> instead of a new one for each exception instance. 
> {code:java}
> private ThrowableProxy(final Throwable throwable, final Set<Throwable> 
> visited) {
>     ...
>     final Map<String, CacheEntry> map = new HashMap<>();
>     this.extendedStackTrace = this.toExtendedStackTrace(stack, map, null,     
>  
>     throwable.getStackTrace());
>     ...
>  }
> {code}
> - We made the benchmark test to  compares the performance of ThrowableProxy 
> optimizations for different exception
>         -  baseline: test `ThrowableProxy` in log4j2, not optimized, with 
> bug, for comparison consideration.
>         -  bugfixed: fixed bug in `ThrowableProxy` accessing the cache.
>         -  optimized: make the cache global, instead of a new one for each 
> exception instance.
> Then we see
> * more than `10` times improvement when the bug is fixed for exceptions with 
> stack element class duplicated many times.
> * and about `2` times further improvement when make the cache global 
> (compared with log4j2, more than `20` times improvement).
> - benchmark test detail: 
> https://github.com/liuwenchn/log4j2-throwableproxy-benchmark
> - PR: https://github.com/apache/logging-log4j2/pull/195
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to