Amichai Rothman created KARAF-4488:
--------------------------------------

             Summary: Memory leak in Karaf log LruList
                 Key: KARAF-4488
                 URL: https://issues.apache.org/jira/browse/KARAF-4488
             Project: Karaf
          Issue Type: Bug
          Components: karaf-shell
    Affects Versions: 4.0.4
            Reporter: Amichai Rothman
            Priority: Minor


The PaxAppender implementation in org.apache.karaf.log.core.internal.LruList 
has a memory management issue - although it is not an infinitely growing memory 
leak, it does hold on to arbitrarily large log strings in memory for an 
arbitrarily long time.

The current LruList implementation does limit the (configurable) number of log 
messages it keeps around in memory, but it does not limit their size or 
duration nor free them up when the system runs out of resources.

I came across this in a live system that got an OutOfMemoryError since it had 
some very large log lines (diagnostics/statistics dump) that were occasionally 
printed out to the log, but when there was little other log activity in 
between, ended up holding multiple instances of these very large log strings 
(MB) in memory simultaneously and eventually exhausting the JVM heap space. 
Although one might argue that an application shouldn't write such long log 
strings, this happens in practice, is allowed by the implementation, and people 
don't expect log strings to remain in memory for long and cause such trouble.

Btw, I'm not sure if the LruList is used for something other than the karaf 
shell command which shows recent log messages. Does it?

Some possible solutions:
- Limit the size of individual log messages (reject if too long).
- Limit the size of individual log messages (end with ellipsis after a given 
max length, or replace entire string with placeholder e.g. "<log message too 
long>").
- Limit the total memory used by all recent log messages, removing the older 
ones from the LRU list if it goes are above the limit - similar to how it 
currently removes messages when the limit on the number of messages to keep is 
reached.
- Use SoftReferences so that the memory is released if the system runs out of 
resources.
- Document this as being by design and blaming the client for writing large log 
messages.

In all options involving a maximum value, this can be made configurable like 
the max number of retained messages.





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

Reply via email to