我正在填充 JVM 堆空间。
更改参数以为 JVM 提供更多堆空间,或者更改代码中算法中的某些内容以不使用太多空间是两个最推荐的选项。
但是,如果已经尝试并应用了这两个,但我仍然遇到内存不足异常,我想看看其他选项是什么。
我发现了“Using a memory mapped file for a huge matrix”这个例子和一个叫做HugeCollections的库这是解决我的问题的有趣方法。不幸的是,这个库已经一年多没有更新了,而且它也不在任何 Maven 存储库中——所以对我来说它不是一个真正可靠的库。
我的问题是,是否有任何其他库可以做到这一点,或者有实现它的好方法(映射集合对象(列表和集合)内存)?
最佳答案
您没有说明您使用的是哪种集合,也没有说明您使用它们的方式,因此很难给出建议。但是,请记住以下几点:
- 将对象保存在 Java 堆上永远是最简单的选择,而且 RAM 相对便宜。
- 盲目地转移到内存映射数据很可能会带来可怕的性能,尤其是当您在文件中四处移动和/或进行大量更改时。基于散列的集合类型是最糟糕的,因为它们通过分发数据来工作。基于树的集合类型通常是更好的选择,而线性集合可以双向使用。
- 一旦移出堆,您就需要一种方法将您的对象转换为 Java 或从 Java 转换为对象。对象序列化是最简单的,但会增加很多开销。通过字节缓冲区访问的二进制对象通常是更好的选择,但您需要具有线程意识。
- 您还必须管理自己的堆外对象垃圾回收。如果您所做的只是创建/更新,这不是问题,但如果您正在删除,很快就会变得很痛苦。
- 如果您有大量数据,并且需要以多种方式访问这些数据,那么数据库可能是您的最佳选择。
关于java - Java 中的内存映射集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12800613/