[英]Memory mapped collections in Java
我正在填充JVM堆空间。
推荐使用两个方法,即更改参数以为JVM提供更多的堆空间,或在代码中的算法中更改某些内容以免使用太多空间。
但是,如果已经尝试并应用了这两个方法,而我仍然遇到内存异常,那么我想看看其他选项是什么。
我发现了有关“ 使用内存映射文件处理巨大矩阵的示例”和一个名为HugeCollections的库的示例 ,它们是解决我的问题的一种有趣方法。 不幸的是,该库已经一年多没有见到更新了,而且也没有任何Maven回购-因此对我而言,这不是一个真正可靠的回购。
我的问题是,是否还有其他库正在执行此操作,或者是否是实现此操作的好方法(具有映射的集合对象(列表和集合)的内存)?
您不会说您正在使用哪种收藏集,也不会说出它们的使用方式,因此很难提出建议。 但是,请记住以下几点:
Unluckily, the library hasn't seen an update for over a year, and it's not in any Maven repo - so for me it's not a really reliable one
,我写了它。 ;)
我建议您看一下https://github.com/peter-lawrey/Java-Chronicle ,它使用了更高的性能。 它确实是为List&Queue设计的,但是您可以将其用于具有附加数据结构的Map或Set。
根据您的要求,您可以编写自己的库。 例如,对于时间序列数据,我编写了一个不同的库,不幸的是它不是开源的,但是可以很干净地加载500 GB以上的表。
它不在任何Maven回购中
这个都不是,但是很高兴有人添加它。
听起来您在内存泄漏方面遇到了麻烦,或者试图将太大的对象放入内存中。
您是否尝试过粗略估计加载数据所需的内存量?
假设您没有内存泄漏或其他问题,并且确实需要太多无法容纳在堆中的存储(我不太可能发现),那么您基本上只有一个选择:
不要将数据放在堆上。 就那么简单。 现在,您使用哪种方法将数据移出取决于您的要求(什么样的数据,更新的频率以及它到底有多少 ?)。
注意:您可以在64位VM上使用非常大的堆,并在必要时扩大OS的交换空间。 残酷地增加最大堆大小(即使这意味着大量交换)可能是最简单的解决方案。 我当然会在您概述的情况下先尝试一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.