netty ByteBuf分析

1.Heap Buffer(堆緩衝區)ide

2.Direct Buffer(直接緩衝區)this

3.Composite Buffer(複合緩衝區)spa

4.PooledByteBuf 池緩衝code

    readerInex 當前讀取索引
    writerIndex 當前寫索引
    0~readerInex 之間被視爲 discard,調用 discardReadBytes() 會釋放空間
    
        @Override
        public ByteBuf discardReadBytes() {
            ensureAccessible();
            if (readerIndex == 0) {
                return this;
            }
            
            if (readerIndex != writerIndex) {
                setBytes(0, this, readerIndex, writerIndex - readerIndex);
                writerIndex -= readerIndex;
                adjustMarkers(readerIndex);
                readerIndex = 0;
            } else {
                adjustMarkers(readerIndex);
                writerIndex = readerIndex = 0;
            }
            return this;
        }
        
        
        @Override
        public ByteBuf ensureWritable(int minWritableBytes) {
            if (minWritableBytes < 0) {
                throw new IllegalArgumentException(String.format(
                        "minWritableBytes: %d (expected: >= 0)", minWritableBytes));
            }

            if (minWritableBytes <= writableBytes()) {
                return this;
            }
            //寫入數據長度大於剩餘長度(默認int max - wirter)
            if (minWritableBytes > maxCapacity - writerIndex) {
                throw new IndexOutOfBoundsException(String.format(
                        "writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s",
                        writerIndex, minWritableBytes, maxCapacity, this));
            }

            // Normalize the current capacity to the power of 2.
            //計算新空間大小
            int newCapacity = calculateNewCapacity(writerIndex + minWritableBytes);

            // Adjust to the new capacity.
            //不一樣類型擴展實現 處理過程實際是直接修改JDK ByteBuffer
            capacity(newCapacity);
            return this;
        }
        
        
        private int calculateNewCapacity(int minNewCapacity) {
            final int maxCapacity = this.maxCapacity;
            final int threshold = 1048576 * 4; // 4 MiB page

            if (minNewCapacity == threshold) {
                return threshold;
            }

            // If over threshold, do not double but just increase by threshold.
            //當超過4M時,直接擴展4M空間
            if (minNewCapacity > threshold) {
                int newCapacity = minNewCapacity / threshold * threshold;
                if (newCapacity > maxCapacity - threshold) {
                    newCapacity = maxCapacity;
                } else {
                    newCapacity += threshold;
                }
                return newCapacity;
            }

            // Not over threshold. Double up to 4 MiB, starting from 64.
            //以雙倍擴展空間
            int newCapacity = 64;
            while (newCapacity < minNewCapacity) {
                newCapacity <<= 1;
            }

            return Math.min(newCapacity, maxCapacity);
        }
相關文章
相關標籤/搜索