Buffer提供了可以直接存取系統實體記憶體的類-DirectBuffer。DirectBuffer繼承自ByteBuffer,ByteBuffer任然在JVM堆上分配記憶體,其最大記憶體,受到最大堆的限制。而DirectBuffer直接分配到實體記憶體中,並不佔用堆空間。
在對ByteBuffer進行訪問的時候,系統會使用一個“核心緩衝區”進行間接的操作。而DirectBuffer所處的位置就相當於這個“核心緩衝區”。
因此,使用DirectBuffer是一種更接近系統底層的方法,速度會比ByteBuffer更快(快一倍左右)。但在建立和銷毀DirectBuffer的開銷卻遠比ByteBuffer高。
//申請DirectBuffer的方法如下ByteBuffer b = ByteBuffer.allocateDirect(500);
在需要頻繁建立Buffer的場合,由於建立和銷毀DirectBuffer的代價比較高,是不適合使用DirectBuffer的,但如果是對DirectBuffer進行複用。那麼在讀寫比較頻繁的情況下,它可以大幅度改善系統效能。
真實應用的時候,需要對DirectBuffer進行監控,以增強DirectBuffer的可用性。
private void monDirectBuffer() throws ClassNotFoundException,Exception,NoSuchFieldException{ Class c = Class.forName("java.nio.Bits"); //通過反射取得私人資料 Field maxMemory = c.getDeclaredField("maxMemory"); maxMemory.setAccessibly(true); Field reservedMemory = c.getDeclaredField("reservedMemory"); reservedMemory.setAccessible(true); synchronized(c){ Long maxMemoryValue = (Long)maxMemory.get(null); //總大小 Long reservedMemoryValue = (Long)reservedMemory.get(null); //剩餘大小 System.out.println("maxMemoryValue: "+maxMemoryValue); System.out.println("reservedMemoryValue: "+reservedMemoryValue); }}