byte buffer一般在網路交互過程中java使用得比較多,尤其是以NIO的框架中;
看名字就知道是以位元組碼作為緩衝的,先buffer一段,然後flush到終端。
而本文要說的一個重點就是HeapByteBuffer與DirectByteBuffer,以及如何合理使用DirectByteBuffer。
1、HeapByteBuffer與DirectByteBuffer,在原理上,前者可以看出分配的buffer是在heap區域的,其實真正flush到遠程的時候會先拷貝得到直接內存,再做下一步操作(考慮細節還會到OS級別的內核區直接內存),其實發送靜態文件最快速的方法是通過OS級別的send_file,只會經過OS一個內核拷貝,而不會來回拷貝;在NIO的框架下,很多框架會採用DirectByteBuffer來操作,這樣分配的內存不再是在java
heap上,而是在C heap上,經過性能測試,可以得到非常快速的網路交互,在大量的網路交互下,一般速度會比HeapByteBuffer要快速好幾倍。
最基本的情況下
分配HeapByteBuffer的方法是:
ByteBuffer.allocate(int capacity);參數大小為位元組的數量
分配DirectByteBuffer的方法是:
ByteBuffer.allocateDirect(int capacity);//可以看到分配內存是通過unsafe.allocateMemory()來實現的,這個unsafe默認情況下java代碼是沒有能力可以調用到的,不過你可以通過反射的手段得到實例進而做操作,當然你需要保證的是程序的穩定性ÿ