直接内存(个人认为是本地直接内存,而不是堆外内存)

那么直接内存到底是什么呢?

直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。

这是百科关于直接内存访问的概述。

 

那么关于直接内存的概述呢?

直接内存是一种加快IO传递的解决方案,个人认为,我们的虚拟机要想将磁盘上的一个文件通过网络传输socket等方式,发送给其他设备,那么就会在多个内存区域之间拷贝多次,才能实现发送这个动作。最关键的就是 堆内存和堆外内存了,这个堆外内存就可以理解为是本地内存,而不是我们所谈及的方法区这块非堆内存了。

直接内存的解决方案是:通过在堆内存中的DirectByteBuffer作为直接缓冲区,对本地内存中的数据进行指向引用,并不需要进行数据上的拷贝,那在发送传输的过程中,Java虚拟机直接通知本地服务(例如网络传输服务),将其指向的本地内存地址的数据传输就可以了。这样解决了Java虚拟机堆内存与本地内存数据的拷贝问题。

注意:本地内存也会存在内存溢出的情况,因为物理机上的内存管理限制,也会存在上限,当内存出现瓶颈,假如虚拟机占用配置过多,那么在本地内存分配的时候,就会出现内存溢出的情况。

 

关于直接内存,一定不能落下的一个问题就是:0拷贝问题(zero-copy)

关于0拷贝这个,我之前在一篇文章简单的分享了一下: