Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在大数据处理过程中有没有办法释放内存?_Java_Jvm - Fatal编程技术网

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

Java 在大数据处理过程中有没有办法释放内存?,java,jvm,Java,Jvm,我有一个存储发票的数据库。我必须使用来自所有发票的信息,通过一系列算法对任何给定的月份进行复杂的操作。检索和处理这些操作所需的数据需要大量内存,因为可能会有很多发票。当用户为这些计算请求的间隔增加到几年时,问题变得越来越严重。结果是我得到了一个PermGen异常,因为垃圾收集器似乎在每个月的计算之间没有完成它的工作 我一直认为使用System.GC来提示GC完成其工作不是一个好的实践。所以我的问题是,除了这个,还有其他方法可以释放内存吗?为了临时存储部分计算,可以强制JVM使用HD交换吗 此外,

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

我一直认为使用System.GC来提示GC完成其工作不是一个好的实践。所以我的问题是,除了这个,还有其他方法可以释放内存吗?为了临时存储部分计算,可以强制JVM使用HD交换吗


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

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

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

  • 尝试重用每个月自己生成的数据结构。所以,假设你有一个发票清单,在下个月重复使用该清单
  • 如果您需要所有这些文件,请考虑在处理时将处理后的文件写入临时文件,然后在准备好后再加载它们。
我们应该记住
System.gc()
并没有真正运行垃圾收集器。它只是要求做同样的事情。JVM可能会也可能不会运行垃圾收集器。我们所能做的就是为垃圾收集提供不必要的数据结构。您可以通过以下方式执行相同的操作:

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

  • 如果您向我们展示您的代码片段,我们可以提供更好的指导。可能您的变量在错误的范围内,因此存在太多时间。根据您对数据执行的操作类型,直接使用数据库执行这些操作可能会更快,而不是将数据加载到java、创建对象和分配内存……尽管这并不能回答您的问题,但是如果你的操作主要是转移数字,做一些计算,重新读写。。那么,您的数据库可以更快地执行这些操作,因为它“更接近源”