根据 newCapacity 分配一个新的 ByteBuffer(JDK)

30 阅读1分钟

public class UnpooledDirectByteBuf { // 底层依赖 JDK 的 DirectByteBuffer ByteBuffer buffer;

@Override
public ByteBuf capacity(int newCapacity) {
    // newCapacity 不能超过 maxCapacity
    checkNewCapacity(newCapacity);
    int oldCapacity = capacity;
    if (newCapacity == oldCapacity) {
        return this;
    }
    // 计算扩容之后需要拷贝的字节数
    int bytesToCopy;
    if (newCapacity > oldCapacity) {
        bytesToCopy = oldCapacity;
    } else {
        ........ 缩容 .......
    }https://www.laipuhuo.com/goodsDetail/01fb9363baf34012b0a88261dc04719b.html

www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… ByteBuffer oldBuffer = buffer; // 根据 newCapacity 分配一个新的 ByteBuffer(JDK) ByteBuffer newBuffer = allocateDirect(newCapacity); oldBuffer.position(0).limit(bytesToCopy); newBuffer.position(0).limit(bytesToCopy); // 将原来 oldBuffer 中的数据拷贝到 newBuffer 中 newBuffer.put(oldBuffer).clear(); // 释放 oldBuffer,设置 newBuffer // 对于 UnpooledUnsafeDirectByteBuf 来说就是将 newBuffer 的地址设置到 memoryAddress 中 setByteBuffer(newBuffer, true); return this; } }

@Override
public int ensureWritable(int minWritableBytes, boolean force) {
    // 如果剩余容量可以满足本次写入操作,则不会扩容,直接返回
    if (minWritableBytes <= writableBytes()) {
        return 0;
    }

    final int maxCapacity = maxCapacity();
    final int writerIndex = writerIndex();
    // 如果本次写入的数据大小已经超过了 ByteBuf 的最大可写容量 maxCapacity - writerIndex
    if (minWritableBytes > maxCapacity - writerIndex) {
        // force = false , 那么停止扩容,直接返回
        // force = true, 直接扩容到 maxCapacity,如果当前 capacity 已经等于 maxCapacity 了则停止扩容
        if (!force || capacity() == maxCapacity) {
            return 1;
        }
        // 虽然扩容之后还是无法满足写入需求,但还是强制扩容至 maxCapacity
        capacity(maxCapacity);
        return 3;
    }
    // 下面就是普通的扩容逻辑
    int fastWritable = maxFastWritableBytes();
    int newCapacity = fastWritable >= minWritableBytes ? writerIndex + fastWritable
            : alloc().calculateNewCapacity(writerIndex + minWritableBytes, maxCapacity);

    // Adjust to the new capacity.
    capacity(newCapacity);
    return 2;
}