【发布时间】:2013-05-27 17:38:00
【问题描述】:
我正在一个相当大的算法中评估来自文本文件的不同数据。
如果文本文件包含多个数据点(我需要的最小值是 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
请注意,如果我只运行部分文本文件,它就可以正常工作。
现在我已经阅读了很多关于这个主题的内容,似乎我必须在某个地方发生数据泄漏,或者我在数组中存储了太多数据(我想我确实这样做了)。
现在我的问题是:我该如何解决这个问题?是否可以更改我的设置以便我仍然可以执行计算,还是我真的需要更多的计算能力?
【问题讨论】:
-
我们如何确定您确切知道它的含义?我们所拥有的只是您这么认为。
-
我认为您应该为此需要分析器的服务。我特别推荐visualgc。
-
分析器到底是做什么的?我以前从未使用过它..
-
具体来说,visualgc 实时可视化所有堆代。您可以准确直观地看到分配和 GC 的各个方面发生了什么。它使您可以快速制定有关可能出现问题的假设。
标签: java arrays performance out-of-memory overhead