1. 程式人生 > >ByteBuffer中兩種申請記憶體方式的區別

ByteBuffer中兩種申請記憶體方式的區別

在Java中當我們要對資料進行更底層的操作時,一般是操作資料的位元組(byte)形式,這時經常會用到ByteBuffer這樣一個類。ByteBuffer提供了兩種靜態例項方式:

public static ByteBuffer allocate(int capacity)  
public static ByteBuffer allocateDirect(int capacity)  

為什麼要提供兩種方式呢?這與Java的記憶體使用機制有關。第一種分配方式產生的記憶體開銷是在JVM中的,而另外一種的分配方式產生的開銷在JVM之外,也就是系統級的記憶體分配(os::malloc())。當Java程式接收到外部傳來的資料時,首先是被系統記憶體所獲取,然後在由系統記憶體複製複製到JVM記憶體中供Java程式使用。所以在另外一種分配方式中,能夠省去複製這一步操作,效率上會有所提高。可是系統級記憶體的分配比起JVM記憶體的分配要耗時得多(需要陷入一次核心態),所以並非不論什麼時候allocateDirect的操作效率都是最高的。以下是一個不同容量情況下兩種分配方式的操作時間對照: 在這裡插入圖片描述

由圖能夠看出,當操作資料量非常小時,兩種分配方式操作使用時間基本是同樣的,第一種方式有時可能會更快,可是當資料量非常大時,DirectAllocate遠遠大於Allocate。