ByteBuf trata directamente con el IO subyacente
1. ¿Cuáles son las categorías de memoria?
2. Cómo reducir la competencia de asignación de memoria multihilo
3. Cómo asignar memoria de diferentes tamaños
Abstracción de memoria y gestor de memoria
Estrategias de asignación para diferentes tamaños y tipos de memoria.
Recuperación de memoria
Estructura ByteBuf
readerIndex, que indica que los datos a leer comienzan desde el puntero actual, y el espacio de 0 a readerIndex indica que no es válido
writerIndex, debe ser mayor que readerIndex, lo que indica que los datos que se escribirán comienzan desde el puntero actual, y el espacio de readerIndex a writerIndex indica que se puede leer
capacidad, debe, el espacio del escritor Índice a la capacidad indica libre para escribir
API de ByteBuf
leer, comenzar a leer desde readerIndex
escribir Comienza a escribir desde writerIndex en adelante
set no mueve ningún puntero, establece directamente en el puntero actual
markReaderIndex guardar readerIndex
resetReaderIndex restaurará el readerIndex para que leer los datos no mueva el puntero
markWriterIndex Igual que el anterior
resetWriterIndex Igual que el anterior
readableBytes () writerIndex - readerIndex
capacidad de writeableBytes () - writerIndex
Clasificación ByteBuf
Agrupados y no agrupados, cuando se asigna una memoria desde una memoria ya asignada, hay un proceso de preasignación, UnPooled es solicitar memoria directamente desde el sistema operativo
Inseguro y no inseguro, inseguro puede obtener directamente la dirección de memoria, puede obtener directamente ByteBuf en la memoria JVM a través de la dirección de memoria y el desplazamiento, no inseguro puede llamar directamente a jdk api para leer y escribir, acceder a datos a través de matrices y subíndices. jdk determina automáticamente si no es seguro o no
Heap y Direct, asignados directamente en el montón, jc gestión automática de reciclaje, confiando en una matriz, las llamadas directas jdk api no serán administradas por el reciclaje de memoria jvm, confiando en jdk subyacente ByteBuffer.
Administrador de memoria ByteBufAllocator
Implementación del esqueleto AbstractByteBufAllocator
UnPooledByteBufAllocator, asigna directamente una matriz de capacidad
newHeapBuffer nueva matriz en el montón sale y guarda
newDirectBuffer se basa en el ByteBuffer subyacente de jdk para guardar la dirección inicial y la capacidad.
PooledByteBufAllocator, primero obtenga el caché local del hilo, PoolThreadCache crea primero PoolArena <byte []>, PoolArena <ByteBuf> estos dos grupos de memoria y asigna memoria en la Arena en el hilo. Al crear un asignador de memoria, se crean dos tipos de matrices, PoolArena.HeapArena y PoolArena.directArena
nuevoHeapBuffer
nuevoDirectBuffer