Class SslBufferPool


  • public class SslBufferPool
    extends java.lang.Object
    A ByteBuffer pool dedicated for SslHandler performance improvement.

    In most cases, you won't need to create a new pool instance because SslHandler has a default pool instance internally.

    The reason why SslHandler requires a buffer pool is because the current SSLEngine implementation always requires a 17KiB buffer for every 'wrap' and 'unwrap' operation. In most cases, the actual size of the required buffer is much smaller than that, and therefore allocating a 17KiB buffer for every 'wrap' and 'unwrap' operation wastes a lot of memory bandwidth, resulting in the application performance degradation.

    • Constructor Summary

      Constructors 
      Constructor Description
      SslBufferPool()
      Creates a new buffer pool whose size is 19267584, which can hold 1024 buffers.
      SslBufferPool​(boolean preallocate, boolean allocateDirect)
      Creates a new buffer pool whose size is 19267584, which can hold 1024 buffers.
      SslBufferPool​(int maxPoolSize)
      Creates a new buffer pool.
      SslBufferPool​(int maxPoolSize, boolean preallocate, boolean allocateDirect)
      Creates a new buffer pool.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      java.nio.ByteBuffer acquireBuffer()
      Acquire a new ByteBuffer out of the SslBufferPool
      private java.nio.ByteBuffer allocate​(int capacity)  
      int getMaxPoolSize()
      Returns the maximum size of this pool in byte unit.
      int getUnacquiredPoolSize()
      Returns the number of bytes which were allocated but have not been acquired yet.
      void releaseBuffer​(java.nio.ByteBuffer buffer)
      Release a previous acquired ByteBuffer
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • MAX_PACKET_SIZE_ALIGNED

        private static final int MAX_PACKET_SIZE_ALIGNED
        See Also:
        Constant Field Values
      • preallocated

        private final java.nio.ByteBuffer preallocated
      • pool

        private final java.util.concurrent.BlockingQueue<java.nio.ByteBuffer> pool
      • maxBufferCount

        private final int maxBufferCount
      • allocateDirect

        private final boolean allocateDirect
      • numAllocations

        private final java.util.concurrent.atomic.AtomicInteger numAllocations
        The number of buffers allocated so far. Used only when preallocated is null.
    • Constructor Detail

      • SslBufferPool

        public SslBufferPool()
        Creates a new buffer pool whose size is 19267584, which can hold 1024 buffers.
      • SslBufferPool

        public SslBufferPool​(boolean preallocate,
                             boolean allocateDirect)
        Creates a new buffer pool whose size is 19267584, which can hold 1024 buffers.
        Parameters:
        preallocate - true if and only if the buffers in this pool has to be pre-allocated at construction time
        allocateDirect - true if and only if this pool has to allocate direct buffers.
      • SslBufferPool

        public SslBufferPool​(int maxPoolSize)
        Creates a new buffer pool.
        Parameters:
        maxPoolSize - the maximum number of bytes that this pool can hold
      • SslBufferPool

        public SslBufferPool​(int maxPoolSize,
                             boolean preallocate,
                             boolean allocateDirect)
        Creates a new buffer pool.
        Parameters:
        maxPoolSize - the maximum number of bytes that this pool can hold
        preallocate - true if and only if the buffers in this pool has to be pre-allocated at construction time
        allocateDirect - true if and only if this pool has to allocate direct buffers.
    • Method Detail

      • getMaxPoolSize

        public int getMaxPoolSize()
        Returns the maximum size of this pool in byte unit. The returned value can be somewhat different from what was specified in the constructor.
      • getUnacquiredPoolSize

        public int getUnacquiredPoolSize()
        Returns the number of bytes which were allocated but have not been acquired yet. You can estimate how optimal the specified maximum pool size is from this value. If it keeps returning 0, it means the pool is getting exhausted. If it keeps returns a unnecessarily big value, it means the pool is wasting the heap space.
      • acquireBuffer

        public java.nio.ByteBuffer acquireBuffer()
        Acquire a new ByteBuffer out of the SslBufferPool
      • releaseBuffer

        public void releaseBuffer​(java.nio.ByteBuffer buffer)
        Release a previous acquired ByteBuffer
      • allocate

        private java.nio.ByteBuffer allocate​(int capacity)