Class Unbox

java.lang.Object
org.apache.logging.log4j.util.Unbox

public class Unbox extends Object
Utility for preventing primitive parameter values from being auto-boxed. Auto-boxing creates temporary objects which contribute to pressure on the garbage collector. With this utility users can convert primitive values directly into text without allocating temporary objects.

Example usage:

 import static org.apache.logging.log4j.util.Unbox.box;
 ...
 long longValue = 123456L;
 double doubleValue = 3.14;
 // prevent primitive values from being auto-boxed
 logger.debug("Long value={}, double value={}", box(longValue), box(doubleValue));
 

This class manages a small thread-local ring buffer of StringBuilders. Each time one of the box() methods is called, the next slot in the ring buffer is used, until the ring buffer is full and the first slot is reused. By default the Unbox ring buffer has 32 slots, so user code can have up to 32 boxed primitives in a single logger call.

If more slots are required, set system property log4j.unbox.ringbuffer.size to the desired ring buffer size. Note that the specified number will be rounded up to the nearest power of 2.

Since:
2.6
  • Field Details

    • LOGGER

      private static final Logger LOGGER
    • BITS_PER_INT

      private static final int BITS_PER_INT
      See Also:
    • RINGBUFFER_MIN_SIZE

      private static final int RINGBUFFER_MIN_SIZE
      See Also:
    • RINGBUFFER_SIZE

      private static final int RINGBUFFER_SIZE
    • MASK

      private static final int MASK
    • threadLocalState

      private static ThreadLocal<Unbox.State> threadLocalState
    • webSafeState

      private static Unbox.WebSafeState webSafeState
  • Constructor Details

    • Unbox

      private Unbox()
  • Method Details

    • calculateRingBufferSize

      private static int calculateRingBufferSize(String propertyName)
    • ceilingNextPowerOfTwo

      private static int ceilingNextPowerOfTwo(int x)
      Calculate the next power of 2, greater than or equal to x.

      From Hacker's Delight, Chapter 3, Harry S. Warren Jr.

      Parameters:
      x - Value to round up
      Returns:
      The next power of 2 from x inclusive
    • box

      public static StringBuilder box(float value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(double value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(short value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(int value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(char value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(long value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(byte value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • box

      public static StringBuilder box(boolean value)
      Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
      Parameters:
      value - the value whose text representation to return
      Returns:
      a StringBuilder containing the text representation of the specified primitive value
    • getState

      private static Unbox.State getState()
    • getSB

      private static StringBuilder getSB()
    • getRingbufferSize

      static int getRingbufferSize()
      For testing.