@Override
    public SystemInfoResult getSystemInfo() {
        try {
            SystemInfoResult.Builder builder = SystemInfoResult.builder(this)
                    .addDetail("Size", getCurrentPoolSize());

            SortedMap<Integer, Long> capacityCountsMap = null;
            try {
                capacityCountsMap = bufferQueues.stream()
                        .flatMap(Queue::stream)
                        .collect(Collectors.groupingBy(Buffer::capacity, Collectors.counting()))
                        .entrySet()
                        .stream()
                        .collect(HasHealthCheck.buildTreeMapCollector(Map.Entry::getKey, Map.Entry::getValue));

                builder.addDetail("Buffer capacity counts", capacityCountsMap);
            } catch (Exception e) {
                LOGGER.error("Error getting capacity counts", e);
                builder.addDetail("Buffer capacity counts", "Error getting counts");
            }

            return builder.build();
        } catch (RuntimeException e) {
            return SystemInfoResult.builder(this)
                    .addError(e)
                    .build();
        }
    }
An bounded self-populating pool of directly allocated ByteBuffers.
The pool holds buffers in a fixed set of sizes and any request for a buffer
will result in a buffer with capacity >= the requested capacity being
returned.
All buffers are cleared ready for use when obtained from the pool.
Once a buffer has been returned to the pool it MUST not be used else
bad things will happen.
<p>
This impl uses lock free {@link ConcurrentLinkedQueue} and {@link Semaphore}
stroom-bytebuffer/src/main/java/stroom/bytebuffer/ByteBufferPoolImpl5.java