命令

值範圍

説明

備註

io.netty.leakDetectionLevel

  • DISABLED - 完成禁止檢測內存泄漏,這個是不推薦。
  • SIMPLE - 如果buffer中出現1%的內存泄漏,打印錯誤日誌,就是上面那樣。但是日誌 是看不到詳細在什麼位置出現了內存泄漏。鑑於性能考慮,這個是在生產環境中默認使用。
  • ADVANCED - 如果buffer的1%出現內存泄漏,打印錯誤,並且輸出詳細的內存泄漏信息。
  • PARANOID - 這個和ADVANCED輸出的內容是一樣的,但它會對每一次請求的buffer做檢查。很適用於調試和單元測試。

 內存泄漏檢測機制的日誌等級

 

 

 

io.netty.allocator.type

  • unpooled:
  • pooled:

ByteBuf的分配器,默認值為ByteBufAllocator.DEFAULT,4.0版本為UnpooledByteBufAllocator。

 

 io.netty.noPreferDirect

  • false 默認值,表示使用對外內存
  • true,表示使用堆內內存

這兩個配置項配合使用,將第一個參數設置成 true

 

io.netty.noUnsafe

  • false 默認值  netty自己通過unsafe接口來分配內存,這裏前提是平台需要支持能訪問unsafe api,如果不能將統一走java nio模式
  • true

 

io.netty.maxDirectMemory

獨立的控制內存參數,默認為-1

 

如果不設置第一個參數則會使用第二個參數來控制。如果MaxDirectMemorySize仍沒有設置,則默認使用java堆大小

堆外內存好處就是不受jvm的機制管制,能夠緩解gc壓力。但是壞處也顯而易見:容易泄漏,且不好排查。如果不設置netty最大使用內存,默認能使用jvm堆大小的內存。如果我們java應用放在容器裏面,則很容易因為忽略堆外內存的使用導致容器被OOM killer殺死。可以通過兩個參數來控制內存使用:

-XX:MaxDirectMemorySize

設置 jvm的堆外內存參數

io.netty.allocator.type

  • Pooled模式:即是cache模式,類比jemalloc的java版實現。後續系列再詳細介紹。數據結構自頂向下依次有:
  • PoolThreadCache(避免NIO線程內存操作競爭)
  • PoolArena(分配器)
  • PoolChunk(內存通過chunk來進行管理)
  • PoolSubPage(內存的最細粒度表示)
  • Unpooled模式:直接分配和釋放內存,由netty直接調用Unsafe接口,相比Pooled模式來講則簡單直接了很多。

 是否使用cache模式

netty為了高性能,默認使用了cache來管理回收的內存,這樣下次再分配時直接從cache中分配,而不用頻繁地調用Unsafe接口

 

 

參考資料:

(1) Netty源碼解析系列:參數篇 - 知乎 (zhihu.com)