在 JVM 外部分配内存并在 JVM 内部使用它

Allocating memory outside JVM and using it inside JVM

是否可以在 JVM 内存之外创建一个持久内存对象,可以在 JVM 内部作为对象使用,以便它在 JVM 重启后仍然存在?

特别的想法是,我们可以在 JVM 外部分配内存,然后使用 JNI 接口访问该内存并关联一些 Java 数组。

有人尝试过这样的破解吗?任何平台依赖性就足够了。

例如,这有助于在 JVM 进程重启期间执行内存中 DB 加载的优化。

是的,即使没有 JNI,这也是完全可能的。

我们的想法是拥有一个 MappedByteBuffer backed by a "file" on tmpfs 文件系统。例如。在 Linux 上,您可以为此使用 /dev/shm(或 /run/shm)挂载点。

此类 MappedByteBuffer 的性能与其他 Direct ByteBuffer 相同,但它会持续 JVM 重启,即您可以在新的 JVM 中再次映射此 "file"。 (我把 "file" 写在引号中,因为它看起来像一个普通的应用程序文件,但它实际上是一个驻留在 RAM 中的共享内存区域)。我们积极将这种技术用于我们的生产内存缓存。

您可以自己使用 MappedByteBuffer,也可以使用构建在 MappedByteBuffer 之上的数据结构,这样它可以在重新启动时可用,甚至可以在 JVM 之间共享。

Chronicle-Map 有一个建模为 ConcurrentMap 的键值存储。例如Map<String, YourType>

Chronicle-Queue 是您系统中每个事件的日志,例如您可以实时使用的日志。

这些都是开源和免费的,让您不必弄清楚如何在持久存储中存储和检索对象。

注意:由于这些是堆外持久化的,因此它们的大小可以达到 TB,而不会影响 GC 暂停时间。