This is an automated email from the ASF dual-hosted git repository. vy pushed a commit to branch recycler-api-3.x in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 6faaf2025e9eb036ff561aa2f21e37f7678d89aa Author: Volkan Yazıcı <[email protected]> AuthorDate: Wed Mar 29 14:52:45 2023 +0200 Remove `ThreadLocal`s in `ParametrizedMessage` --- .../log4j/message/ParameterizedMessage.java | 32 ++++++++++------------ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java index 811d80f0e4..74879b89c8 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java @@ -19,7 +19,8 @@ package org.apache.logging.log4j.message; import java.util.Arrays; import java.util.Objects; -import org.apache.logging.log4j.util.Constants; +import org.apache.logging.log4j.spi.LoggingSystem; +import org.apache.logging.log4j.spi.Recycler; import org.apache.logging.log4j.util.StringBuilderFormattable; import org.apache.logging.log4j.util.StringBuilders; @@ -67,8 +68,12 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable { private static final int HASHVAL = 31; - // storing JDK classes in ThreadLocals does not cause memory leaks in web apps, so this is okay - private static final ThreadLocal<StringBuilder> threadLocalStringBuilder = new ThreadLocal<>(); + private static final Recycler<StringBuilder> STRING_BUILDER_RECYCLER = LoggingSystem.getRecyclerFactory().create( + () -> new StringBuilder(DEFAULT_STRING_BUILDER_SIZE), + stringBuilder -> { + StringBuilders.trimToMaxSize(stringBuilder, DEFAULT_STRING_BUILDER_SIZE); + stringBuilder.setLength(0); + }); private String messagePattern; private final Object[] argArray; @@ -183,24 +188,17 @@ public class ParameterizedMessage implements Message, StringBuilderFormattable { @Override public String getFormattedMessage() { if (formattedMessage == null) { - final StringBuilder buffer = getThreadLocalStringBuilder(); - formatTo(buffer); - formattedMessage = buffer.toString(); - StringBuilders.trimToMaxSize(buffer, Constants.MAX_REUSABLE_MESSAGE_SIZE); + final StringBuilder buffer = STRING_BUILDER_RECYCLER.acquire(); + try { + formatTo(buffer); + formattedMessage = buffer.toString(); + } finally { + STRING_BUILDER_RECYCLER.release(buffer); + } } return formattedMessage; } - private static StringBuilder getThreadLocalStringBuilder() { - StringBuilder buffer = threadLocalStringBuilder.get(); - if (buffer == null) { - buffer = new StringBuilder(DEFAULT_STRING_BUILDER_SIZE); - threadLocalStringBuilder.set(buffer); - } - buffer.setLength(0); - return buffer; - } - @Override public void formatTo(final StringBuilder buffer) { if (formattedMessage != null) {
