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);
}
}