Class StringBuilderEncoder

java.lang.Object
org.apache.logging.log4j.core.layout.StringBuilderEncoder
All Implemented Interfaces:
Encoder<StringBuilder>

public class StringBuilderEncoder extends Object implements Encoder<StringBuilder>
Encoder for StringBuilders that uses ThreadLocals to avoid locking as much as possible.
  • Field Details

    • threadLocal

      private final ThreadLocal<Object[]> threadLocal
      This ThreadLocal uses raw and inconvenient Object[] to store three heterogeneous objects (CharEncoder, CharBuffer and ByteBuffer) instead of a custom class, because it needs to contain JDK classes, no custom (Log4j) classes. Where possible putting only JDK classes in ThreadLocals is preferable to avoid memory leaks in web containers: the Log4j classes may be loaded by a separate class loader which cannot be garbage collected if a thread pool threadlocal still has a reference to it. Using just one ThreadLocal instead of three separate ones is an optimization:
      invalid reference
      ThreadLocal.ThreadLocalMap
      is polluted less,
      invalid reference
      ThreadLocal.ThreadLocalMap#get()
      is called only once on each call to encode(java.lang.StringBuilder, org.apache.logging.log4j.core.layout.ByteBufferDestination) instead of three times.
    • charset

      private final Charset charset
    • charBufferSize

      private final int charBufferSize
    • byteBufferSize

      private final int byteBufferSize
  • Constructor Details

    • StringBuilderEncoder

      public StringBuilderEncoder(Charset charset)
    • StringBuilderEncoder

      public StringBuilderEncoder(Charset charset, int charBufferSize, int byteBufferSize)
  • Method Details

    • encode

      public void encode(StringBuilder source, ByteBufferDestination destination)
      Description copied from interface: Encoder
      Encodes the specified source object to some binary representation and writes the result to the specified destination.
      Specified by:
      encode in interface Encoder<StringBuilder>
      Parameters:
      source - the object to encode.
      destination - holds the ByteBuffer to write into.
    • getThreadLocalState

      private Object[] getThreadLocalState()
    • logEncodeTextException

      private static void logEncodeTextException(Exception ex, StringBuilder text)