超出了Java GC开销限制 - 需要自定义解决方案

Jea*_*aul 7 java arrays performance overhead out-of-memory

我正在用相当大的算法评估来自文本文件的不同数据.

如果文本文件包含的数据点超过数据点(我需要的最小值是130万个数据点),则会出现以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
   at java.util.regex.Matcher.<init>(Unknown Source)
   at java.util.regex.Pattern.matcher(Unknown Source)
   at java.lang.String.replaceAll(Unknown Source)
   at java.util.Scanner.processFloatToken(Unknown Source)
   at java.util.Scanner.nextDouble(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

当我在Eclipse中运行它时,安装的jre6(标准VM)具有以下设置:

-Xms20m -Xmx1024m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:NewSize=10m 
-XX:MaxNewSize=10m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 
-XX:+CMSClassUnloadingEnabled
Run Code Online (Sandbox Code Playgroud)

请注意,如果我只运行部分文本文件,它可以正常工作.

现在我已经阅读了很多关于这个主题的内容,似乎某个地方我必须有数据泄漏或者我在数组中存储了太多数据(我认为我这样做).

现在我的问题是:我该如何解决这个问题?

  • 是否可以更改我的设置,以便我仍然可以执行计算,还是我真的需要更多的计算能力?(不知道从哪里得到)
  • 我在某处读到,最好使用id和CPU指针,而不是将数据放入数组并让它处理它.但是我怎样才能改变我的代码,使它只提供指针?

基本上我正在寻找一些防止大量内存存储/泄漏的一般指导原则.

Eri*_*zke 3

真正关键的 vm arg 是-Xmx1024m,它告诉 VM 使用最多 1024 MB 的内存。最简单的解决方案是在那里使用更大的数字。您可以尝试-Xmx2048m-Xmx4096m,或任何数字,假设您的计算机有足够的 RAM 来处理它。

我不确定您是否从其他虚拟机参数中获得了很多好处。在大多数情况下,如果您告诉 Java 要使用多少空间,它会智能地处理其余参数。我建议删除除-Xmx参数之外的所有内容并查看其执行情况。

更好的解决方案是尝试改进您的算法,但我还没有足够详细地阅读它以提供任何建议。

  • 正确的。如果您幸运的话,这对于您的数据集来说就足够了,您无需费心进行更困难/耗时的更改。总共 4GB 后,您的虚拟机中可能会获得最多 3GB 的空间,但您可能需要关闭一些其他程序。 (2认同)