摘要:對于小內存小于的分配還會將細化成更小的單位。按大小分有兩大類,種情況小于的情況,最小空間為,對齊大小為,區間為,所以共有種情況。大于等于的情況,總共有四種,。
Netty之ByteBuf深入分析
[TOC]
分析思路 內存與內存管理器的抽象 ByteBuf 結構以及重要的API* {@link ByteBuf} provides two pointer variables to support sequential * read and write operations - {@link #readerIndex() readerIndex} for a read * operation and {@link #writerIndex() writerIndex} for a write operation * respectively. The following diagram shows how a buffer is segmented into * three areas by the two pointers: * ** +-------------------+------------------+------------------+ * | discardable bytes | readable bytes | writable bytes | * | | (CONTENT) | | * +-------------------+------------------+------------------+ * | | | | * 0 <= readerIndex <= writerIndex <= capacity ** *Readable bytes (the actual content)
Pooled池化內存分配每次從預先分配好的一塊內存取一段連續內存封裝成ByteBuf提供給應用程序,
Unpooled非池化每次進行內存分配的時候調用系統API向操作系統申請一塊內存
Unsafe直接獲取ByteBuf在JVM內存地址調用JDK的Unsafe進行讀寫操作,通過ByteBuf分配內存首地址和當前指針基于內存偏移地址獲取值,
非Unsafe不依賴JDK的Unsafe對象,通過內存數組和索引獲取值
Heap在堆上進行內存分配,分配內存需要被GC管理,無需手動釋放內存,依賴底層byte數組,
Direct調用JDK的API進行內存分配,分配內存不受JVM控制最終不會參與GC過程,需要手動釋放內存避免造成內存無法釋放,依賴DirectByteBuffer對象內存
內存分配器ByteBufAllocator分析buffer()方法分配內存是否為Direct/Heap內存依賴具體實現,
ioBuffer()方法分配內存更希望是適合IO的Direct Buffer,directBuffer()/headBuffer()方法堆內/堆外進行內存分配,compositeBuffer()方法分配將兩個ByteBuf合并變成CompositeByteBuf
buffer()方法分配Buffer依賴實現分配內存,調用directBuffer()/heapBuffer()方法分配默認Buffer容量和最大擴充容量的ByteBuf,newDirectBuffer()/newHeapBuffer()方法分配Pooled/Unpooled依賴底層實現
PooledByteBufAllocator從預先分配好的內存取一段內存,
UnpooledByteBufAllocator調用系統API分配內存,調用hasUnsafe()方法獲取Unsafe決定分配Unsafe/非Unsafe
newHeapBuffer()方法通過hasUnsafe()方法判斷是否有Unsafe
傳遞initialCapacity容量Byte數組參數setArray()方法設置array以及setIndex()方法設置讀/寫指針
創建UnpooledUnsafeHeapByteBuf/UnpooledHeapByteBuf,
_get***()方法通過Unsafe方式返回數組對象偏移量[BYTE_ARRAY_BASE_OFFSET+index]對應的byte/數組索引方式返回array數組index位置byte
newDirectBuffer()方法通過hasUnsafe()方法判斷是否有Unsafe
調用allocateDirect(initialCapacity)創建DirectByteBuffer
使用setByteBuffer()方法設置buffer[UnpooledUnsafeDirectByteBuf
使用directBufferAddress()方法獲取buffer內存地址設置memoryAddress
創建UnpooledUnsafeDirectByteBuf/UnpooledDirectByteBuf,
_get***()方法通過addr()方法memoryAdress+index計算內存地址
Unsafe獲取對應這塊內存的byte/ByteBuffer獲取buffer index位置對應的byte
不同規格大小和不同類別的內存的分配策略 內存規格介紹0 <-tiny->512B<-small->8K<-normal->16M<-huge-> |______________________| | SubPage Page Chunk
16M作為分界點對應的Chunk,
所有的內存申請以Chunk為單位向操作系統申請,
內存分配在Chunk里面執行相應操作,
16M Chunk按照Page進行切分為2048個Page,8K Page按照SubPage切分
內存的回收過程 常見問題 Netty 的內存的類別有哪些? 堆內內存/堆外內存堆內[基于2048byte字節內存數組分配]
堆外[基于JDK的DirectByteBuffer內存分配]
Unsafe/非UnsafeUnsafe[通過JDK的Unsafe對象基于物理內存地址進行數據讀寫]
非Unsafe[調用JDK的API進行讀寫]
UnPooled/PooledUnPooled[每次分配內存申請內存]
Pooled[預先分配好一整塊內存,分配的時候用一定算法從一整塊內存取出一塊連續內存]
如何減少多線程內存分配之間的競爭關系?PooledByteBufAllocator內存分配器結構維護Arena數組,所有的內存分配都在Arena上進行,
通過PoolThreadCache對象將線程和Arena進行一一綁定, 默認情況一個Nio線程管理一個Arena實現多線程內存分配相互不受影響減少多線程內存分配之間的競爭
不同大小的內存是如何進行分配的?Page級別的內存分配通過完全二叉樹的標記查找某一段連續內存,
Page級別以下的內存分配首先查找到Page然后把此Page按照SubPage大小進行劃分最后通過位圖的方式進行內存分配
不同大小的內存是如何進行分配的?2Netty一次向系統申請16M的連續內存空間,這塊內存通過PoolChunk對象包裝,進一步的把這16M內存分成了2048個頁(pageSize=8k)。頁作為Netty內存管理的最基本的單位 ,所有的內存分配首先必須申請一塊空閑頁。
對于小內存(小于4096)的分配還會將Page細化成更小的單位Subpage。Subpage按大小分有兩大類,36種情況:Tiny:小于512的情況,最小空間為16,對齊大小為16,區間為[16,512),所以共有32種情況。Small:大于等于512的情況,總共有四種,512,1024,2048,4096。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77039.html
摘要:接上篇源碼分析之三我就是大名鼎鼎的一的處理循環在中一個需要負責兩個工作第一個是作為線程負責相應的操作第二個是作為任務線程執行中的任務接下來我們先從操縱方面入手看一下數據是如何從傳遞到我們的中的是模型的一個實現并且是基于的那么從的前生今世之四 接上篇Netty 源碼分析之 三 我就是大名鼎鼎的 EventLoop(一) Netty 的 IO 處理循環 在 Netty 中, 一個 Even...
摘要:維基百科中對的解釋是零拷貝技術是指計算機執行操作時,不需要先將數據從某處內存復制到另一個特定區域。維基百科里提到的零拷貝是在硬件和操作系統層面的,而本文主要介紹的是在應用層面的優化。 維基百科中對 Zero-copy 的解釋是 零拷貝技術是指計算機執行操作時,CPU不需要先將數據從某處內存復制到另一個特定區域。這種技術通常用于通過網絡傳輸文件時節省CPU周期和內存帶寬。 維基百科里提到...
摘要:如果什么事都沒得做,它也不會死循環,它會將線程休眠起來,直到下一個事件來了再繼續干活,這樣的一個線程稱之為線程。而請求處理邏輯既可以使用單獨的線程池進行處理,也可以跟放在讀寫線程一塊處理。 Netty到底是什么 從HTTP說起 有了Netty,你可以實現自己的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的P...
摘要:主要用來檢測對象是否泄漏。子類實現相關的方法是否支持數組,判斷緩沖區的實現是否基于字節數組如果緩沖區的實現基于字節數組,返回字節數組 ByteBuf ByteBuf需要提供JDK ByteBuffer的功能(包含且不限于),主要有以下幾類基本功能: 7種Java基礎類型、byte[]、ByteBuffer(ByteBuf)的等的讀寫 緩沖區自身的copy和slice 設置網絡字節序 ...
閱讀 574·2021-11-18 10:02
閱讀 1057·2021-11-02 14:41
閱讀 684·2021-09-03 10:29
閱讀 1901·2021-08-23 09:42
閱讀 2737·2021-08-12 13:31
閱讀 1207·2019-08-30 15:54
閱讀 1960·2019-08-30 13:09
閱讀 1434·2019-08-30 10:55