Gestión de memoria Netty

concepto clave

relacion de billar

PoolArena - coordinador de gestión de memoria

PoolArena es el coordinador de la gestión de la memoria. Tiene una lista enlazada compuesta por PoolChunkList dentro

PoolChunkList - gestión de PoolChunk

Hay una lista enlazada compuesta por PoolChunk dentro de PoolChunkList. Por lo general, todos los usos de PoolChunk (memoria asignada/ChunkSize) en una PoolChunkList están en el mismo rango.
Cada PoolChunkList tiene su propia tasa de uso mínimo o rango de tasa de uso máximo, y se formará una lista vinculada entre PoolChunkList y PoolChunkList, y la PoolChunkList con un rango de tasa de uso más pequeño estará más arriba en la lista vinculada.

PoolChunck: la memoria mínima que Netty aplica al sistema operativo

Para reducir la aplicación frecuente de memoria al sistema operativo, Netty solicitará una memoria grande a la vez, y su tamaño está determinado por ChunkSize (el valor predeterminado es 16M, es decir, solicita 16M de memoria del sistema operativo a la vez). tiempo). Luego, administre esta parte de la memoria y asigne una parte de ella a los usuarios de la memoria (es decir, ByteBuf) a pedido cada vez.

Página——La unidad de memoria más pequeña administrada por PoolChunck

La memoria mínima que PoolChunk puede administrar se llama Page, y el tamaño está determinado por PageSize (el valor predeterminado es 8K), es decir, la memoria aplicada a PoolChunk a la vez debe estar en la unidad de página (una o más páginas).

PoolSubpage - pequeño administrador de memoria

La memoria mínima administrada por PoolChunk es una página (8K por defecto), y cuando la memoria que necesitamos es relativamente pequeña, la asignación directa de una página sin duda provocará un desperdicio de memoria.
PoolSubPage es el administrador que se usa para administrar una memoria tan pequeña.

PoolThreadCache: caché local de subprocesos, lo que reduce la competencia en la asignación de memoria

PoolArena inevitablemente crea competencia Además de crear múltiples PoolArenas para reducir la competencia, Netty también permite que los subprocesos almacenen en caché la memoria que se ha solicitado al liberar memoria, en lugar de devolverla a PoolArena inmediatamente.
La memoria en caché se almacena en PoolThreadCache, que es una variable local de subprocesos, por lo que es segura para subprocesos y no es necesario bloquear el acceso a ella.

MemoriaRegiónCaché

Una cola interna, todos los nodos en la misma cola pueden considerarse como bloques de memoria de la misma especificación utilizada por el subproceso. Al mismo tiempo, también tiene un atributo de tamaño para controlar la cola demasiado larga (cuando la cola está llena, el bloque de memoria de este tamaño no se almacenará en caché, sino que se devolverá directamente a PoolArena)

Cómo gestiona PoolChunck las páginas

poolchunk-1
poolchunk-2

poolchunk-3

Primero, PoolChunk organiza la memoria interna a través de un árbol binario completo. Tomando como ejemplo el ChunkSize predeterminado de 16M y PageSize de 8K, un PoolChunk se puede dividir en 2048 páginas. Considerando estas 2048 páginas como el ancho de los nodos hoja, se puede obtener un árbol con una profundidad de 11 (2^11=2048).

Deje que cada nodo de hoja administre una página, luego la memoria administrada por su nodo principal es de dos páginas (el nodo principal tiene dos nodos de hoja izquierdo y derecho), y así sucesivamente, el nodo raíz del árbol administra todas las páginas de este PoolChunk ( porque todos los nodos de hoja son sus nodos secundarios), y el tamaño de la memoria administrada por un nodo en el árbol es todas las páginas administradas por los nodos de hoja contenidos en el subárbol enraizado en el nodo.

Revise el proceso de aplicación de la memoria:

PooledByteBufAllocator.newHeapBuffer() comienza a solicitar memoria.
Obtenga la variable local del subproceso PoolThreadCache y el PoolArena vinculado al subproceso
para asignar memoria a través de PoolArena. Primero obtenga el objeto ByteBuf (que puede ser reclamado o creado por el grupo de objetos), antes comenzando la asignación de memoria
Primero juzgue el nivel de memoria, intente encontrar un bloque de memoria caché con las mismas especificaciones de PoolThreadCache, si no, asigne memoria de PoolArena
Para la memoria de nivel Normal, busque un PoolChunk adecuado de la lista enlazada de PoolChunkList para asignar memoria , si no es Primero, solicite un PoolChunk como el sistema operativo y asigne la página correspondiente por el PoolChunk
. Para memoria pequeña y de nivel pequeño, busque la asignación de memoria del grupo de caché PoolSubpage correspondiente. Si no hay PoolSubpage, la línea irá al paso 5, y asigne PoolChunk primero. , y luego PoolChunk asigna la página a PoolSubpage para su uso.
Para la memoria del nivel Enorme, no se almacenará en caché, se aplicará cuando se use, y
se reciclará directamente cuando se lance 8. Use la memoria obtenida para ByteBuf para completar una aplicación de memoria.

referencia

https://www.cnblogs.com/insaneXs/p/13726158.html

Supongo que te gusta

Origin blog.csdn.net/wenxueliu/article/details/130694525
Recomendado
Clasificación