除了上图中【虚拟机运行时数据区】之外,还有直接内存(Direct Memory)可能会导致OOM。在NIO基于Channel和Buffer的I/O中,可以只用Native函数库直接分配对外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,这样可以避免在Java堆和Native堆中来回复制数据。本机直接内存的分配不会受到Java堆大小的限制,但还是会受到本机总内存大小以及处理器寻址空间的限制。
Q:在使用Buffer的时候,有可能会遇到OOM,需要研究下DirectByteBuffer是如何操作直接内存的