Java中的内存映射集合

Mar*_*Spa 1 java collections memory-mapping

我正在填补JVM堆空间.

更改参数以为JVM提供更多堆空间,或者在代码中更改我的算法中的某些内容而不是使用如此多的空间是最推荐的两个选项.

但是,如果这两个已经被尝试和应用,并且我仍然有内存异常,我想看看其他选项是什么.

我发现了这个" 使用内存映射文件作为一个巨大的矩阵 "的例子和一个名为HugeCollections的库,这是解决我的问题的有趣方法.不幸的是,图书馆已经有一年多的时间没有看到更新,并且它不在任何Maven回购中 - 所以对我来说它并不是真正可靠的.

我的问题是,有没有其他库这样做,或实现它的好方法(具有集合对象(列表和集)内存映射)?

par*_*fal 6

你没有说你正在使用什么类型的集合,或者你使用它们的方式,所以很难给出建议.但是,请记住以下几点:

  • 保持Java堆上的对象始终是最简单的选择,RAM相对便宜.
  • 盲目地转移到内存映射数据很可能会带来可怕的性能,特别是如果你在文件中移动和/或进行大量更改.基于散列的集合类型是最差的,因为它们通过分发数据来工作.基于树的集合类型通常是更好的选择,线性集合可以双向进行.
  • 一旦你在堆外移动,你需要一种方法将对象转换为Java或从Java转换.对象序列化是最简单的,但会增加很多开销.通过字节缓冲区访问的二进制对象通常是更好的选择,但您需要具有线程意识.
  • 您还必须为堆外对象管理自己的垃圾收集.如果你正在做的只是创建/更新,那不是问题,但如果你要删除,很快就会变得很痛苦.
  • 如果您有大量数据,并且需要以各种方式访问​​该数据,那么数据库可能是您最好的选择.