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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值