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

标签 java arrays performance out-of-memory overhead

我正在用一个相当大的算法评估文本文件中的不同数据。

如果文本文件包含多个数据点(我需要的最少数据点是某物,例如 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)

当我在 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

请注意,如果我只运行文本文件的一部分,它工作正常。

现在我已经阅读了很多关于这个主题的文章,看来我一定是在某个地方发生了数据泄漏,或者我在数组中存储了太多数据(我想我确实如此)。

现在我的问题是:我该如何解决这个问题?是否可以更改我的设置,以便我仍然可以执行计算,或者我真的需要更多的计算能力吗?

最佳答案

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

我不确定您是否从任何其他 VM args 中获得了很多好处。大多数情况下,如果您告诉 Java 要使用多少空间,它会很聪明地处理其余的参数。我建议删除除 -Xmx 参数之外的所有内容,然后查看其执行情况。

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

关于超出 Java GC 开销限制 - 需要自定义解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16865073/

相关文章:

java - 使用密码加密消息java

java - 如何确定哪个用户正在从 Android 应用程序发出 Rest 请求?

ruby - 在 ruby​​ 中的哈希数组中查找包含键的哈希的最佳方法?

c++ - 无效的数组分配

arrays - 在 Perl 中,如何在不查看数组大小的情况下检测(绑定(bind))数组是否为空?

performance - 忽略 T-SQL 中的 NULL 参数

Java 读/写文件

java - 使用RADIUS的RSA新引脚模式服务器通信

python - Pandas 小数据效率

excel - 提高生成随机数的嵌套循环的速度