1:PooledByteBufAllocator ? ?內(nèi)存池入口,應用通過該類從內(nèi)存池中申請內(nèi)存
PoolThreadCache:線程緩存池
Recycler:上文的Recycler是個對象池,儲存的是相應類型的堆中對象的集合。
2:PooledByteBufAllocator獲取bytebuf步驟:
? ? ? 1)如果是pool類型,先在線程對象池中獲取一個相應類型的poolBuffer對象,這個對象是在堆中的,也是返回的對象,然后會使用PoolThreadCache這個線程內(nèi)存池,獲取一塊合適大小的內(nèi)存。接下來根據(jù)這塊內(nèi)存的信息對這個poolBuffer對象進行init,比如設置內(nèi)存的address,length等,用戶就可以通過這個buffer對象對相應的內(nèi)存進行操作。
? ? ? 2)注意區(qū)別線程對象池和線程內(nèi)存池。線程對象池指同一類型的對象集合,用戶也只能通過對象來進行操作,比如讀寫數(shù)據(jù)。而線程內(nèi)存池是許多內(nèi)存塊的集合,用戶通過對象讀寫數(shù)據(jù)還是要定位到實際的內(nèi)存地址(虛擬內(nèi)存地址)。內(nèi)存池就通過把對象和一塊內(nèi)存綁定,對象的讀寫操作都會反應到這塊內(nèi)存上。
3)內(nèi)存是有限的,為了最大化內(nèi)存的利用率以及提高內(nèi)存分配回收的效率,netty實現(xiàn)了類似jemalloc內(nèi)存分配的方式給對象分配內(nèi)存。
4)獲取一個buffer對象-->給buffer對象屬性賦值(賦的值就是內(nèi)存的地址、大?。?/p>
5) ?比如現(xiàn)在需要分配一個UnpooledHeapByteBuf類型的ByteBuf對象,其初始大小為20,最大容量為100,因為是unpooled,意味著這各類型的ByteBuf是沒有對象池的,需要的時候直接new一個即可
? ? ? ? ? ? ? ? ? ? ? ? ? (1)new? ? ? ? ? ? UnpooledHeapByteBuf(this,initialCapacity,maxCapacity);
單純的一個沒有經(jīng)過初始化(成員變量沒有賦值)的ByteBuf是不能進行讀寫的,因為其讀寫方法都需要確切的讀寫內(nèi)存地址的。對于UnpooledHeapByteBuf類型的ByteBuf,其是一個HeapByteBuf,Heap意味著這個ByteBuf的讀寫操作是在JVM堆上進行的,其讀寫內(nèi)存地址需要在jvm對上進行分配,所以在初始化時要根據(jù)需要的大小創(chuàng)建一個Byte類型的數(shù)組Byte[]對UnpooledDirectByteBuf進行初始化,接下來對這個Buf的讀寫都會反應在這個字節(jié)數(shù)組中。
6)對于UnpooledDirectByteBuf類型的ByteBuf,Direct意味著這個ByteBuf的讀寫實現(xiàn)方法是以直接內(nèi)存為基礎進行實現(xiàn)的,其讀寫區(qū)域是在直接內(nèi)存上,在初始化時構造一個DirectByteBuffer對象(nio中的ByteBuffer)賦值給UnpooledDirectByteBuf的buf屬性,接下來對這個UnpooledDirectByteBuf類型對象的讀寫都會反應到這個ByteBuffer上。
7)對于pool類型的,