在大数据处理过程中有没有办法释放内存?

时间:2013-04-29 14:18:03

标签: java jvm

我有一个存储发票的数据库。我必须使用所有发票中的信息,通过一系列算法为任何给定的月份进行复杂的操作。检索和处理这些操作所需的数据会占用大量内存,因为可能会有大量发票。当用户为这些计算请求的间隔达到几年时,问题变得越来越严重。结果是我得到了一个PermGen异常,因为看起来垃圾收集器在每个月的计算之间没有完成它的工作。

我一直使用System.GC提示GC做它的工作不是一个好习惯。所以我的问题是,除此之外还有其他方法可以释放记忆吗?您是否可以强制JVM使用HD交换以暂时存储部分计算?

另外,我尝试在每个月末计算时使用System.gc,结果是CPU使用率很高(由于调用了垃圾收集器)而且内存使用率相当低。这可以完成这项工作,但我认为这不是一个合适的解决方案。

2 个答案:

答案 0 :(得分:2)

不要使用System.gc()。它总是需要很长时间才能运行,而且通常不会做任何事情。

最好的办法是重写代码,尽可能减少内存使用量。您尚未准确解释代码的工作原理,但这里有两个想法:

  • 尝试重复使用您自己为每个月生成的数据结构。所以,假设您有一张发票清单,请在下个月重复使用该清单。
  • 如果您需要全部,请考虑在处理时将处理过的文件写入临时文件,然后在准备好后重新加载。

答案 1 :(得分:1)

我们应该记住System.gc()并没有真正运行垃圾收集器。它只是要求做同样的事情。 JVM可能运行也可能不运行垃圾收集器。我们所能做的就是为垃圾收集提供不必要的数据结构。你也可以这样做:

  1. Null指定为使用后的任何数据结构的值。因此,没有活动线程可以访问它(简而言之,为gc启用它)。
  2. 重复使用相同的结构,而不是创建新结构。