正常环境下,JVM建设一个缓冲区的时候,实际上做了如下几件事:
对付不涉及到IO的操纵,软件开发,这样的处理惩罚没有任何问题,可是当举办IO操纵的时候就会呈现一点机能问题.
所有的IO操纵都需要操纵系统进入内核态才行,而JVM历程属于用户态历程, 当JVM需要把一个缓冲区写到某个Channel或Socket的时候,需要切换到内核态.
而内核态由于并不知道JVM内里这个缓冲区存储在物理内存的什么地点,图纸加密,而且这些物理地点并不必然是持续的(可能说不必然是IO操纵需要的块布局),所以在切换之前JVM需要把缓冲区复制到物理内存一块持续的内存上, 然后由内核去读取这块物理内存,整合成持续的、分块的内存.
为了办理这个问题, Java的某些版本会把物理区域分派好的部门内存做缓存就不消每次都开发一块空间,但结果还不足好,究竟复制的部门是少不了的.
JDK1.4之后引入了NIO, 提供了一种内存映射技能, 让我们可以直接从Java代码中建设DirectBuffer,这种Buffer在建设的时候直接就在物理内存中分派一块持续内存,当需要利用的时候不再需要复制,内核直接挪用即可. 但缺点也是显而易见的,就是每次分派都较量昂贵一点,同时由于分派的内存不在Java Heap中,所以也不会受用户配置的堆巨细的限制.
凡是环境下,大量利用IO操纵的时候利用内存映射长短常值得的,下面是我画的一张图,利便影象:
,软件开发