我当前存储了大量数据AtomicReferenceArray<X>
,并且同时从大量线程进行处理。
每个元素都很小,而且我刚刚达到了Integer.MAX_VALUE
个以上的条目。遗憾的是,List
和java中的数组仅限于Integer.MAX_VALUE
(或更少)值。现在我有足够的内存来保留更大的内存结构 - 机器在64b VM中拥有大约250GB的内存。
是否有被长号索引的AtomicReferenceArray<X>
的替换? (否则我将不得不创建自己的包装器来存储几个较小的AtomicReferenceArray
,并将较长的访问映射到较小的访问中。)
答案 0 :(得分:3)
听起来是时候使用本机内存了。拥有4亿多个对象会导致一些戏剧性的GC暂停时间。但是,如果使用本机内存,则可以在几乎不影响堆的情况下执行此操作。您还可以使用内存映射文件来支持更快的重新启动以及在JVM之间共享数据。
不确定您的具体需求是什么,但有许多开源数据结构可以做到这一点; HugeArray,Chronicle Queue和Chronicle Map您可以创建一个1 TB的阵列,但几乎不使用堆,也不会产生GC影响。
BTW对于您创建的每个对象,都有一个8字节的引用和一个16字节的头。通过使用本机内存,每个对象可以节省24个字节,例如4 bn * 24是96 GB的内存。