java - Java 中的内存映射集合

标签 java collections memory-mapping

我正在填充 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/

相关文章:

java - 如何加快我的 ArrayList 搜索速度?

c++ - 将 QFile 内容复制到另一个 QFile,最佳方法是什么?

java - Cloudera - Oozie 无法从workflow.xml 获取属性

java - 在上传到 Firebase 存储之前重命名图片

java - 如何将ArrayList的索引添加到同一个Arraylist Java

c# - 这是 AutoMapper 2.0.0 和 2.2.0 之间的重大变化吗?

collections - Set 和 Array 之间是否存在 Collection 父类(super class)型?如果不是,一个函数如何在 Sets 和 Arrays 上是多态的(用于迭代)?

c - 如何正确地字节移位一大块数据?

c++ - 在内存映射中使用 reinterpret_cast 时处理未定义的行为

java - 如何用mock代替方法调用?