Details
Description
Make MapMessage garbage-free.
While working on LOG4J2-1677, I found that MapFilter itself can avoid allocating temporary objects, but when filtering a MapMessage, the message allocates a java/util/Collections$UnmodifiableMap:
at java.util.Collections.unmodifiableMap(Collections.java:1318) at org.apache.logging.log4j.message.MapMessage.getData(MapMessage.java:102) at org.apache.logging.log4j.core.filter.MapFilter.filter(MapFilter.java:70)
Apart from the filtering, logging a MapMessage allocates a StringBuilder and an iterator over the TreeMap:
at java.lang.StringBuilder.<init>(StringBuilder.java:85) at org.apache.logging.log4j.message.MapMessage.asString(MapMessage.java:189) at org.apache.logging.log4j.message.MapMessage.asString(MapMessage.java:172) at org.apache.logging.log4j.message.MapMessage.getFormattedMessage(MapMessage.java:229) at org.apache.logging.log4j.core.async.RingBufferLogEvent.setMessage(RingBufferLogEvent.java:127)
Attachments
Issue Links
- depends upon
-
LOG4J2-1681 Introduce interfaces IndexedStringMap and IndexedReadOnlyStringMap
-
- Closed
-
- is depended upon by
-
LOG4J2-1684 (GC) Avoid allocating temporary objects in StructuredDataMessage
-
- Open
-
-
LOG4J2-1677 (GC) Avoid allocating temporary objects in MapFilter
-
- Closed
-