Netty學習05- Netty對鎖的使用優化和對記憶體的使用優化
阿新 • • 發佈:2020-10-23
學習第18-20節
同步問題的核心三要素:原子性、可見性、有序性
鎖的分類:
樂觀鎖(java.util.concurrent 包中的原子類)與悲觀鎖(Synchronized)
公平鎖 new ReentrantLock (true)與非公平鎖 new ReentrantLock ()
共享鎖與獨享鎖:ReadWriteLock ,其讀鎖是共享鎖,其寫鎖是獨享鎖
Netty從以下幾個方面優化鎖的使用:
Netty減少鎖的物件和範圍,減少鎖的粒度(比如把Synchronized加到程式碼塊而不是方法上)。
Netty減少鎖物件本身的大小,減少空間佔用(比如自住實現volatile的long而不是AtomicLong)。
Netty根據不同場景選擇不同的併發包,因需而變。
Netty很好的衡量好鎖的價值,能不用則不用鎖(區域性序列 + 整體並行 > 一個佇列 + 多個執行緒模式),這樣的好處是:
(1)降低使用者開發難度、邏輯簡單、提升處理效能
(2)避免鎖帶來的上下文切換和併發保護等額外開銷
Netty避免用鎖:用 ThreadLocal 來避免資源爭用,例如 Netty 輕量級的執行緒池實現io.netty.util.Recycler#threadLocal
Netty從以下幾個方面優化對記憶體的使用:
1、減少對像本身大小:儘量定義類變數而非例項變數,
3、Zero-Copy:使用邏輯組合、包裝以及JDK的zero-copy介面,代替實際複製
4、使用堆外記憶體(堆heap,非堆non heap,堆外off heap)
5、使用記憶體池(引入物件池,開源實現Apache Commons Pool,Netty自實現輕量級記憶體池)
Netty中切換堆內外記憶體的方法
Netty中切換記憶體池的方法
注:內容參考極客時間相關課程