首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超出Java GC开销限制-需要自定义解决方案

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

Stack Overflow用户
提问于 2013-06-01 04:04:18
回答 3查看 2.5K关注 0票数 7

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

如果文本文件包含的数据点多于数据点(我需要的最小值是sth。比如130万个数据点),它会给出以下错误:

代码语言:javascript
复制
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)的以下设置运行它时:

代码语言:javascript
复制
-Xms20m -Xmx1024m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:NewSize=10m 
-XX:MaxNewSize=10m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 
-XX:+CMSClassUnloadingEnabled

请注意,如果我只运行文本文件的一部分,它就可以很好地工作。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-01 04:17:55

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

我不确定您是否从任何其他VM参数中获得了多少好处。在大多数情况下,如果您告诉Java要使用多少空间,那么对于其余的参数,它将是智能的。我建议删除除-Xmx参数之外的所有内容,看看它的性能如何。

一个更好的解决方案是尝试改进你的算法,但我还没有仔细阅读它以提供任何建议。

票数 3
EN

Stack Overflow用户

发布于 2014-03-16 21:41:50

正如您所说的,数据大小确实非常大,如果在使用-Xmx jvm参数后,它也不能容纳在一个计算机内存中,那么您可能想要转移到集群计算,使用多台计算机来解决您的问题。为此,您必须使用消息传递接口(MPI)。

MPJ ExpressMPI for Java的一个非常好的实现,或者在像C/C++这样的语言中,已经有一些很好的MPI实现,比如Open MPImpich2。我不确定它是否会在这种情况下对你有所帮助,但在未来的项目中肯定会对你有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2013-06-01 04:27:36

我建议你

  • 使用探查器将内存使用量降至最低。我怀疑你可以通过使用原语、二进制数据和更紧凑的collections.
  • increase你机器中的内存,将它减少到原来的1/10甚至更多。上一次我对数百个信号进行反向测试时,我有256 GB的主内存,有时这几乎不够用。内存越多越好。
  • 使用内存映射文件将内存和数据集的大小增加到您的机器和程序可以支持的时间。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16865073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档