5.Java程序优化-直接内存访问

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

你可能感兴趣的:(Java性能调优)