Java IO 底层原理&刷盘机制 & pagecache和mmap在java中的使用

文章是摘录: 大部分是同一个作者:

Java IO 底层原理 :
https://blog.csdn.net/xiaoduanayu/article/details/107055472
摘要:
1.普通IO每次都会产生write系统调用
FileOutputStream.write(msg.getBytes());

2.带缓冲区的 BufferedOutputStream 性能提升的法宝就是:每次调用 write() 方法并不会产生实际的 write 系统调用,而是会先将数据存放于 BufferedOutputStream 实例内部的缓冲区中(缓冲区默认大小 8 KB),等缓冲区满、或者手动调用 BufferedOutputStream.flush() 或 close() 方法时,才会真正调用 write 系统调用将缓冲区数据写入 page cache

  1. 操作系统自己会控制刷盘机制, 但是如果你想手动刷盘:
    使用 RandomAccessFile 读写文件时,在 RandomAccessFile.write() 后使用 RandomAccessFile.getFD().sync() 方法手动刷盘
    使用 FileChannel 读写文件时,在 FileChannel.write() 后使用 FileChannel.force() 方法手动刷盘
    使用 MappedByteBuffer (mmap) 读写文件时,在 MappedByteBuffer.put() 后使用 MappedByteBuffer.force() 方法手动刷盘

此外, 有几篇相关文章:
通过零拷贝实现高效的数据传输
有关Zero-Copy、MMap以及DirectByteBuffer的一切
详述DirectByteBuffer直接内存与回收
RandomAccessFile、FileChannel和MappedByteBuffer
以普通方式去读写文件时,会产生 read/write 系统调用(这两个的目的地是pagecache, 即内存中而不是刷盘),而通过 mmap 方式操作文件时,在文件读写的过程中不会产生 read/write 系统调用。
FileChannel (nio)可读写, 流io仅可读或仅可写

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值