我当前正在AtomicReferenceArray<X>中存储大量数据,并同时从大量线程进行处理。

每个元素都很小,所以我将要拥有多个Integer.MAX_VALUE条目。不幸的是,java中的List和数组仅限于Integer.MAX_VALUE(或更少)值。现在,我有足够的内存来在内存中保留更大的结构-该计算机在64b VM中具有约250GB的内存。

是否可以替换以long索引的AtomicReferenceArray<X>? (否则,我将不得不创建自己的包装器,该包装器存储几个较小的AtomicReferenceArray并将长访问映射到较小访问中的int访问。)

最佳答案

听起来是时候使用本机内存了。拥有4+十亿个对象将导致一些戏剧性的GC暂停时间。但是,如果您使用本机内存,则几乎不会对堆产生任何影响。您还可以使用内存映射文件来支持更快的重新启动以及在JVM之间共享数据。

不确定您的特定需求是什么,但是有很多开源数据结构可以做到这一点; HugeArrayChronicle QueueChronicle Map您可以创建一个1 TB但几乎不使用堆且不影响GC的阵列。

顺便说一句,对于您创建的每个对象,都有一个8字节的引用和一个16字节的标头。通过使用本机内存,您可以为每个对象节省24个字节,例如40亿* 24是96 GB的内存。

10-08 02:01