DirectByteBuffer直接内存的使用场景和作用
生命周期长的大对象,
减少java堆GC, 减少内存copy
http://www.importnew.com/26334.html
1 public class DirectByteBufferTest { 2 3 4 @Test 5 public void test_copyFile() throws IOException { 6 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10);//100kbytes 7 FileChannel readChannel = FileChannel.open(new File("D:/in.txt").toPath()); 8 //out.txt必须已经存在, writeChannel必须以WRITE方式打开 9 FileChannel writeChannel = FileChannel.open(new File("D:/out.txt").toPath(), StandardOpenOption.WRITE); 10 int read; 11 while ((read = readChannel.read(byteBuffer)) != -1) { 12 //buffer从读切换到写 13 byteBuffer.flip(); 14 // 打印信息必须放在flip后面, 否则decode出来的是上次read的结果.根据in.txt的字符编码修改下面的ISO_8859_1 15 //System.out.println(read + "--" + StandardCharsets.ISO_8859_1.decode(byteBuffer)); 16 writeChannel.write(byteBuffer); 17 // 写完之后清空缓冲区,否则read=0一直死循环 18 byteBuffer.clear(); 19 } 20 writeChannel.close(); 21 readChannel.close(); 22 } 23 }
测试其他总结:
ByteBuffer.allocateDirect缓冲区大小根据输入文件的大小调整,但是太大时输出性能也提高不了多少, 对于大文件,1M的缓存区应该差不多了。
对于超大文件, 应该换成其他读取方式
benchmark: https://developer.ibm.com/articles/j-zerocopy