To reduce memory garbage production the plugin reuses as much memory as it can. To support this, the plugin implements and uses a byte array pooling mechanism through the BufferPool static class. The plugin uses this class to allocate and release byte[]s back to the pool.

To avoid keeping reference to too much memory the plugin requests buffers with a minimum size. This way if the BufferPool has no buffer for the requested size, it can return a larger buffer. Also, buffers stored in the pool can time out, releasing back to the runtime for garbage collection.

Options

Pooling mechanism can be disabled, configured and used by outside of the plugin. Configurable fields are the following:

  • IsEnabled

Setting this field to false the pooling mechanism can be disabled. Its default value is true.

  • RemoveOlderThan

Buffer entries that released back to the pool and older than this value are removed from the pool (so the GC can collect them) when next maintenance is triggered. Its default value is 30 seconds.

  • RunMaintenanceEvery

How often pool maintenance must run. Its default value is 10 seconds.

  • MinBufferSize

Minimum buffer size that the plugin will allocate when the requested size is smaller than this value, and canBeLarger is set to true. Its default value 256 bytes.

  • MaxBufferSize

Maximum size of a buffer that the plugin will store. Its default value is long.MaxValue.

  • MaxPoolSize

Maximum accumulated size of the stored buffers. Its default value is 10 Mb.

  • RemoveEmptyLists

Whether to remove empty buffer stores from the free list. Its default value is true.

  • IsDoubleReleaseCheckEnabled

If it set to true and a byte[] is released more than once it will log out an error. Its default value is true when run in the editor, false otherwise.

So to disable pooling the following line can be added:

BestHTTP.PlatformSupport.Memory.BufferPool.IsEnabled = false;

The following functions are available to use the pool:

  • byte[] Get(long size, bool canBeLarger)

Get a byte array from the pool. If canBeLarge is true, the returned buffer might be larger than the requested size.

  • void Release(byte[] buffer)

Release back a byte array to the pool.

  • byte[] Resize(ref byte[] buffer, int newSize, bool canBeLarger)

Resize a byte array. It will release the old one to the pool and get a new one from the pool.

  • void Clear()

Remove all stored entries instantly.

BufferSegment

BufferSegment is a wrapper around a byte[] and you should not use the Data’s Length property! BufferSegment is used when the byte[] is from the BufferPool, its length is usually is power of two. The array usually larger than the real payload it contains (so the BufferSegment’s Count is not equal to its Data’s Length) and the payload might not start on the Data’s zeroth index (hence the BufferSegment’s Offset property).