首页 > 代码库 > Java直接内存与堆内存
Java直接内存与堆内存
NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自ByteBuffer,但和普通的ByteBuffer不同,普通的ByteBuffer仍在JVM堆上分配内存,其最大内存受到最大堆内存的限制;而DirectBuffer直接分配在物理内存中,并不占用堆空间,其可申请的最大内存受操作系统限制。
直接内存的读写操作比普通Buffer快,但它的创建、销毁比普通Buffer慢。
因此直接内存使用于需要大内存空间且频繁访问的场合,不适用于频繁申请释放内存的场合。
以下是一些测试:
代码:
1 public class DirectMemory { 2 // 直接分配内存 3 public static void directAccess() { 4 long startTime = System.currentTimeMillis(); 5 ByteBuffer b = ByteBuffer.allocateDirect(500); 6 for (int i = 0; i < 1000000; i++) { 7 for (int j = 0; j < 99; j++) 8 b.putInt(j); 9 b.flip();10 for (int j = 0; j < 99; j++)11 b.getInt();12 b.clear();13 }14 long endTime = System.currentTimeMillis();15 System.out.println("directAccess:" + (endTime - startTime));16 }17 18 // 分配堆内存19 public static void bufferAccess() {20 long startTime = System.currentTimeMillis();21 ByteBuffer b = ByteBuffer.allocate(500);22 for (int i = 0; i < 1000000; i++) {23 for (int j = 0; j < 99; j++)24 b.putInt(j);25 b.flip();26 for (int j = 0; j < 99; j++)27 b.getInt();28 b.clear();29 }30 long endTime = System.currentTimeMillis();31 System.out.println("bufferAccess" + (endTime - startTime));32 }33 34 public static void directAllocate() {35 long startTime = System.currentTimeMillis();36 for (int i = 0; i < 1000000; i++) {37 ByteBuffer.allocateDirect(1000);38 }39 long endTime = System.currentTimeMillis();40 System.out.println("directAllocate:" + (endTime - startTime));41 }42 43 public static void bufferAllocate() {44 long startTime = System.currentTimeMillis();45 for (int i = 0; i < 1000000; i++) {46 ByteBuffer.allocate(1000);47 }48 long endTime = System.currentTimeMillis();49 System.out.println("bufferAllocate:" + (endTime - startTime));50 }51 52 public static void main(String args[]) {53 54 bufferAccess();55 directAccess();56 57 System.out.println();58 59 bufferAllocate();60 directAllocate();61 }
结果:
bufferAccess175directAccess:134bufferAllocate:233directAllocate:634
Java直接内存与堆内存
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。