我正在填满 JVM 堆空间。
更改参数以为 JVM 提供更多堆空间,或更改代码中算法中的某些内容以不使用这么多空间是最推荐的两个选项。
但是,如果这两个已经被尝试和应用,并且我仍然遇到内存不足的异常,我想看看其他选项是什么。
我发现了这个例子“对巨大的矩阵使用内存映射文件 http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html“和一个名为海量收藏 https://code.google.com/p/vanilla-java/wiki/HugeCollections这是解决我的问题的有趣方法。不幸的是,该库已经一年多没有看到更新了,而且它也不在任何 Maven 存储库中 - 所以对我来说它不是一个真正可靠的库。
我的问题是,是否有任何其他库可以做到这一点,或者实现它的好方法(具有集合对象(列表和集合)内存映射)?
您没有说明您正在使用哪种类型的集合,或者您使用它们的方式,因此很难给出建议。但是,请记住以下几点:
- 将对象保留在 Java 堆上始终是最简单的选择,而且 RAM 相对便宜。
- 盲目地移动到内存映射数据很可能会带来可怕的性能,特别是当您在文件中移动和/或进行大量更改时。基于哈希的集合类型是最差的,因为它们通过分发数据来工作。基于树的集合类型通常是更好的选择,而线性集合可以是双向的。
- 一旦移出堆,您就需要一种方法来将对象转换为 Java 或从 Java 转换对象。对象序列化是最简单的,但会增加大量开销。通过字节缓冲区访问的二进制对象通常是更好的选择,但您需要具有线程意识。
- 您还必须管理自己的堆外对象的垃圾收集。如果您所做的只是创建/更新,这不是问题,但如果您要删除,很快就会变得很痛苦。
- 如果您有大量数据,并且需要以多种方式访问这些数据,那么数据库可能是您的最佳选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)