malloc)直接向操作系統申請內存。DirectByteBuffer 對象作為引用,操作堆外內存。傳統 I/O:磁盤 → 內核緩衝區 → 用戶堆內存 → 內核 Socket 緩衝區 → 網卡(2 次用戶/內核態切換,2 次拷貝)。
NIO 直接內存:磁盤 → 內核緩衝區 → 直接內存 → 網卡(避免堆內存拷貝,減少 GC 壓力,提升大數據傳輸吞吐)。
-Xmx 不控制直接內存。-XX:+UseCompressedOops 等自動擴展參數,但未顯式限制 -XX:MaxDirectMemorySize,JVM 嘗試擴展堆時可能因直接內存已佔用過多導致物理內存耗盡,拋出 OutOfMemoryError: Direct buffer memory。DirectByteBuffer 佔用極少堆內存(僅引用對象),Young GC 難以觸發,依賴 System.gc() 或 Full GC 才能回收底層堆外內存,易造成「假性泄漏」。-XX:MaxDirectMemorySize=512m(根據業務評估)。DirectBufferPool MBean 或 NMT (Native Memory Tracking) 報告。Cleaner 或反射調用 DirectByteBuffer.cleaner().clean() 主動釋放,避免等待 GC。