Java 中如何读取/写入堆外内存?

pyt*_*nic 1 java memory scala heap-memory apache-spark

在我的 Spark 程序中,我对分配和使用 Java 垃圾收集器未触及的数据感兴趣。基本上,我想像在 C++ 中那样自己对此类数据进行内存管理。这是使用堆外内存的好例子吗?其次,如何在 Java 或 Scala 中读写堆外内存。我尝试寻找示例,但找不到任何示例。

Art*_*mGr 5

手动内存管理对于垃圾收集语言来说是一种可行的优化策略。垃圾收集是已知的开销来源,可以定制算法以将其最小化。例如,当选择哈希表实现时,人们可能更喜欢开放寻址,因为它在主数组上手动分配其条目,而不是将它们处理到语言内存分配及其 GC。作为另一个示例,这里有一个Trie 搜索器,它将 Trie 打包到单个字节数组中,以最大限度地减少 GC 开销。类似的优化可用于正则表达式。

当Java数组用作数据的低级存储时,这种优化与面向数据的设计齐头并进,其中数据存储在数组中以获得更好的缓存局部性。面向数据的设计广泛应用于性能至关重要的游戏开发中。

在 JavaScript 中,这种数组支持的数据存储是asm.js的重要组成部分。

Java 世界中使用的大多数垃圾收集器都充分支持数组支持的方法,因为它们会尽力避免移动大型数组。

如果您想更深入地研究,在 Linux 中您可以在“/dev/shm”文件系统中创建一个文件。该文件系统由 RAM 支持,除非操作系统内存不足,否则不会刷新到磁盘。对此类文件进行内存映射(使用FileChannel.map)是直接从操作系统获取堆外内存的足够好的方法。(MappedByteBuffer操作经过 JIT 优化以直接内存访问,减去边界检查)。

如果您想更深入,那么您必须求助于 JNI 库才能访问 C 级内存分配器malloc.