我有一个存储发票的数据库。我必须使用所有发票中的信息,通过一系列算法为任何给定的月份进行复杂的操作。检索和处理这些操作所需的数据会占用大量内存,因为可能会有大量发票。当用户为这些计算请求的间隔达到几年时,问题变得越来越严重。结果是我得到了一个PermGen异常,因为看起来垃圾收集器在每个月的计算之间没有完成它的工作。
我一直使用System.GC提示GC做它的工作不是一个好习惯。所以我的问题是,除此之外还有其他方法可以释放记忆吗?您是否可以强制JVM使用HD交换以暂时存储部分计算?
另外,我尝试在每个月末计算时使用System.gc,结果是CPU使用率很高(由于调用了垃圾收集器)而且内存使用率相当低。这可以完成这项工作,但我认为这不是一个合适的解决方案。
答案 0 :(得分:2)
不要使用System.gc()
。它总是需要很长时间才能运行,而且通常不会做任何事情。
最好的办法是重写代码,尽可能减少内存使用量。您尚未准确解释代码的工作原理,但这里有两个想法:
答案 1 :(得分:1)
我们应该记住System.gc()
并没有真正运行垃圾收集器。它只是要求做同样的事情。 JVM可能运行也可能不运行垃圾收集器。我们所能做的就是为垃圾收集提供不必要的数据结构。你也可以这样做:
Null
指定为使用后的任何数据结构的值。因此,没有活动线程可以访问它(简而言之,为gc启用它)。