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

时间:2016-02-06 13:43:20

标签: java memory jvm

是否可以在JVM内存之外创建一个持久性内存对象,可以在JVM中作为对象使用,以便它能够在JVM重启后继续存在?

特别的想法是我们可以在JVM之外分配内存,然后使用JNI接口来访问这个内存,并将一些Java数组与它相关联。

有人试图执行此类黑客攻击吗?任何平台依赖都足够了。

例如,这有助于在重新启动JVM进程期间执行内存数据库加载的优化。

2 个答案:

答案 0 :(得分:12)

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

我们的想法是让一个{"文件"支持MappedByteBuffer。在tmpfs文件系统上。例如。在Linux上,您可以使用/dev/shm(或/run/shm)mountpoint。

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

答案 1 :(得分:5)

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

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

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

这些都是开源的和免费的,除了你必须解决如何从持久存储中存储和检索对象。

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