5

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

我一直使用 System.GC 来暗示 GC 完成其工作并不是一个好习惯。所以我的问题是,除此之外还有其他释放内存的方法吗?您可以强制 JVM 使用 HD 交换来临时存储部分计算吗?

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

4

2 回答 2

2

永远不要使用System.gc(). 它总是需要很长时间才能运行,而且通常什么都不做。

最好的办法是重写代码以尽可能减少内存使用。您还没有准确解释您的代码是如何工作的,但这里有两个想法:

  • 尝试重用您每个月自己生成的数据结构。因此,假设您有一张发票清单,请在下个月重复使用该清单。
  • 如果您需要所有这些,请考虑在处理时将处理后的文件写入临时文件,然后在准备好时重新加载它们。
于 2013-04-29T14:20:54.203 回答
1

我们应该记住System.gc()并没有真正运行垃圾收集器。它只是要求做同样的事情。JVM 可能会也可能不会运行垃圾收集器。我们所能做的就是使不必要的数据结构可用于垃圾收集。您可以通过以下方式执行相同操作:

  1. Null在任何数据结构被使用后赋值为它的值。因此,没有活动线程能够访问它(简而言之,为 gc 启用它)。
  2. 重用相同的结构而不是创建新的结构。
于 2013-04-29T14:48:53.313 回答