是否可以在JVM内存之外创建一个持久性内存对象,可以在JVM中作为对象使用,以便它能够在JVM重启后继续存在?
特别的想法是我们可以在JVM之外分配内存,然后使用JNI接口来访问这个内存,并将一些Java数组与它相关联。
有人试图执行此类黑客攻击吗?任何平台依赖都足够了。
例如,这有助于在重新启动JVM进程期间执行内存数据库加载的优化。
答案 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的暂停时间。