虽然 异步和非阻塞能够提升I/O的性能,但是也会带来一些额外的性能成本,例如,会增加线程数量从而增加CPU的消耗,同时也会导致程序设计复杂度的上升。如果设计的不合理反而会导致性能下降,实际应用中需要根据应用场景综合评估。
java NIO,引入了通道和缓冲区来执行I/O,NIO使用java.nio.ByteBuffer.allocateDirect()方法来分配内存。
NIO direct memory, 分配的内存是本机上的内存而不是java堆上的内存,调用os的os::malloc()函数。
直接ByteBuffer产生的数据如果和网络或者磁盘交互都在操作系统的内核空间产生,不需要将数据复制到Java内存中,很显然执行这种I/O操作要比一般的从OS的内核空间到java堆上的切换操作快得多,因为他们可以避免在java堆与本机堆之间复制数据。
直接ByteBuffer对象会自动清理本机缓冲区,但这个过程只能作为java堆GC的一部分来执行,因此他们不会自动响应施加在本机堆上的压力。