Make configurable the initial and max size of InternalThreadLocalMap#stringBuilder
Motivation: In some cases of using an `InternalThreadLocalMap#stringBuilder`, the `StringBuilder`s size can often exceed the exist limit (1024 bytes). This can lead to permanent memory reallocation. Modifications: Add custom properties for the initial capacity and maximum size (after which the `StringBuilder`s capacity will be reduced to the initial capacity). Result: An `InternalThreadLocalMap#stringBuilder`s initial and max size is configurable. Fixes [#7092].
This commit is contained in:
parent
505993a2fb
commit
e249b453a0
@ -18,6 +18,8 @@ package io.netty.util.internal;
|
|||||||
|
|
||||||
import io.netty.util.concurrent.FastThreadLocal;
|
import io.netty.util.concurrent.FastThreadLocal;
|
||||||
import io.netty.util.concurrent.FastThreadLocalThread;
|
import io.netty.util.concurrent.FastThreadLocalThread;
|
||||||
|
import io.netty.util.internal.logging.InternalLogger;
|
||||||
|
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.CharsetDecoder;
|
import java.nio.charset.CharsetDecoder;
|
||||||
@ -35,10 +37,23 @@ import java.util.WeakHashMap;
|
|||||||
*/
|
*/
|
||||||
public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap {
|
public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap {
|
||||||
|
|
||||||
|
private static final InternalLogger logger = InternalLoggerFactory.getInstance(InternalThreadLocalMap.class);
|
||||||
|
|
||||||
private static final int DEFAULT_ARRAY_LIST_INITIAL_CAPACITY = 8;
|
private static final int DEFAULT_ARRAY_LIST_INITIAL_CAPACITY = 8;
|
||||||
|
private static final int STRING_BUILDER_INITIAL_SIZE;
|
||||||
|
private static final int STRING_BUILDER_MAX_SIZE;
|
||||||
|
|
||||||
public static final Object UNSET = new Object();
|
public static final Object UNSET = new Object();
|
||||||
|
|
||||||
|
static {
|
||||||
|
STRING_BUILDER_INITIAL_SIZE =
|
||||||
|
SystemPropertyUtil.getInt("io.netty.threadLocalMap.stringBuilder.initialSize", 1024);
|
||||||
|
logger.debug("-Dio.netty.threadLocalMap.stringBuilder.initialSize: {}", STRING_BUILDER_INITIAL_SIZE);
|
||||||
|
|
||||||
|
STRING_BUILDER_MAX_SIZE = SystemPropertyUtil.getInt("io.netty.threadLocalMap.stringBuilder.maxSize", 1024 * 4);
|
||||||
|
logger.debug("-Dio.netty.threadLocalMap.stringBuilder.maxSize: {}", STRING_BUILDER_MAX_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
public static InternalThreadLocalMap getIfSet() {
|
public static InternalThreadLocalMap getIfSet() {
|
||||||
Thread thread = Thread.currentThread();
|
Thread thread = Thread.currentThread();
|
||||||
if (thread instanceof FastThreadLocalThread) {
|
if (thread instanceof FastThreadLocalThread) {
|
||||||
@ -163,17 +178,16 @@ public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap
|
|||||||
}
|
}
|
||||||
|
|
||||||
public StringBuilder stringBuilder() {
|
public StringBuilder stringBuilder() {
|
||||||
final int stringBuilderCapacity = 1024;
|
StringBuilder sb = stringBuilder;
|
||||||
if (stringBuilder == null) {
|
if (sb == null) {
|
||||||
stringBuilder = new StringBuilder(stringBuilderCapacity);
|
return stringBuilder = new StringBuilder(STRING_BUILDER_INITIAL_SIZE);
|
||||||
} else {
|
|
||||||
if (stringBuilder.capacity() > stringBuilderCapacity) {
|
|
||||||
stringBuilder.setLength(stringBuilderCapacity);
|
|
||||||
stringBuilder.trimToSize();
|
|
||||||
}
|
|
||||||
stringBuilder.setLength(0);
|
|
||||||
}
|
}
|
||||||
return stringBuilder;
|
if (sb.capacity() > STRING_BUILDER_MAX_SIZE) {
|
||||||
|
sb.setLength(STRING_BUILDER_INITIAL_SIZE);
|
||||||
|
sb.trimToSize();
|
||||||
|
}
|
||||||
|
sb.setLength(0);
|
||||||
|
return sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Charset, CharsetEncoder> charsetEncoderCache() {
|
public Map<Charset, CharsetEncoder> charsetEncoderCache() {
|
||||||
|
Loading…
Reference in New Issue
Block a user