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

And*_*niy 11 java memory jvm

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

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

有人试图进行这样的黑客攻击吗?任何平台依赖都足够了.

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

apa*_*gin 12

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

我们的想法是在文件系统上有一个由"文件"支持的MappedByteBuffertmpfs.例如,在Linux上,您可以使用/dev/shm(或/run/shm)mountpoint.

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


Pet*_*rey 5

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

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

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

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

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