Repository: logging-log4j2 Updated Branches: refs/heads/master 3e34488dc -> 7fb832460
LOG4J2-1715 Avoid allocating temporary objects in NdcPatternConverter Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7fb83246 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7fb83246 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7fb83246 Branch: refs/heads/master Commit: 7fb8324601b396cb92f9a50b72c1ecb423370001 Parents: 3e34488 Author: rpopma <[email protected]> Authored: Sat Nov 19 22:22:24 2016 +0900 Committer: rpopma <[email protected]> Committed: Sat Nov 19 22:22:24 2016 +0900 ---------------------------------------------------------------------- .../log4j/spi/DefaultThreadContextStack.java | 16 ++++++++++++++-- .../log4j/spi/MutableThreadContextStack.java | 17 +++++++++++++++-- src/changes/changes.xml | 3 +++ 3 files changed, 32 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7fb83246/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java index 241fbb7..7a07a89 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java @@ -22,13 +22,15 @@ import java.util.Iterator; import java.util.List; import org.apache.logging.log4j.ThreadContext.ContextStack; +import org.apache.logging.log4j.util.StringBuilderFormattable; +import org.apache.logging.log4j.util.StringBuilders; import org.apache.logging.log4j.util.Strings; /** * A copy-on-write thread-safe variant of {@code org.apache.logging.log4j.spi.ThreadContextStack} in which all mutative * operations (add, pop, and so on) are implemented by making a fresh copy of the underlying list. */ -public class DefaultThreadContextStack implements ThreadContextStack { +public class DefaultThreadContextStack implements ThreadContextStack, StringBuilderFormattable { private static final long serialVersionUID = 5050501L; @@ -281,6 +283,16 @@ public class DefaultThreadContextStack implements ThreadContextStack { } @Override + public void formatTo(final StringBuilder buffer) { + final MutableThreadContextStack values = STACK.get(); + if (values == null) { + buffer.append("[]"); + } else { + StringBuilders.appendValue(buffer, values); + } + } + + @Override public void trim(final int depth) { if (depth < 0) { throw new IllegalArgumentException("Maximum stack depth cannot be negative"); @@ -297,7 +309,7 @@ public class DefaultThreadContextStack implements ThreadContextStack { /* * (non-Javadoc) - * + * * @see org.apache.logging.log4j.ThreadContext.ContextStack#getImmutableStackOrNull() */ @Override http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7fb83246/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableThreadContextStack.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableThreadContextStack.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableThreadContextStack.java index 9722684..03c77da 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableThreadContextStack.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableThreadContextStack.java @@ -22,11 +22,12 @@ import java.util.Iterator; import java.util.List; import org.apache.logging.log4j.ThreadContext.ContextStack; +import org.apache.logging.log4j.util.StringBuilderFormattable; /** * TODO */ -public class MutableThreadContextStack implements ThreadContextStack { +public class MutableThreadContextStack implements ThreadContextStack, StringBuilderFormattable { private static final long serialVersionUID = 50505011L; @@ -197,6 +198,18 @@ public class MutableThreadContextStack implements ThreadContextStack { } @Override + public void formatTo(final StringBuilder buffer) { + buffer.append('['); + for (int i = 0; i < list.size(); i++) { + if (i > 0) { + buffer.append(',').append(' '); + } + buffer.append(list.get(i)); + } + buffer.append(']'); + } + + @Override public int hashCode() { final int prime = 31; int result = 1; @@ -238,7 +251,7 @@ public class MutableThreadContextStack implements ThreadContextStack { public void freeze() { frozen = true; } - + /** * Returns whether this context stack is frozen. * @return whether this context stack is frozen. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7fb83246/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 90dbf16..11cf886 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -39,6 +39,9 @@ <action issue="LOG4J2-1706" dev="rpopma" type="fix"> Make TimeFilter usable as global filter and as logger filter. </action> + <action issue="LOG4J2-1715" dev="rpopma" type="fix"> + (GC) Avoid allocating temporary objects in NdcPatternConverter. (Note that use of the ThreadContext stack is not garbage-free.) + </action> <action issue="LOG4J2-1714" dev="rpopma" type="fix"> (GC) Avoid allocating temporary objects in AbstractStyleNameConverter. </action>
