Análisis de código fuente de Netty (4) - asignación de memoria

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

 

Supongo que te gusta

Origin www.cnblogs.com/xiaofeiyang/p/12688010.html
Recomendado
Clasificación