【问题标题】:Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded线程“主”java.lang.OutOfMemoryError 中的异常:超出 GC 开销限制
【发布时间】:2011-10-06 06:54:52
【问题描述】:

我无法运行我的进程。它给出了以下异常:“线程“main”中的异常 java.lang.OutOfMemoryError:Java 堆空间”

java -Xms32m -Xmx516m FilteringSNP_genus 线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间 在 java.util.Arrays.copyOf(Arrays.java:2882) 在 java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100) 在 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515) 在 java.lang.StringBuffer.append(StringBuffer.java:306) 在 java.io.BufferedReader.readLine(BufferedReader.java:345) 在 java.io.BufferedReader.readLine(BufferedReader.java:362) 在 FilteringSNP_genus.main(FilteringSNP_genus.java:65)

我尝试了不同的内存使用配置,例如:

java -Xms32m -Xmx1024m FilteringSNP_genus

但它没有起作用,并且增加 -XmxVALUE 已经给出了 GC 开销限制超出异常:

线程“主”java.lang.OutOfMemoryError 中的异常:超出 GC 开销限制 在 java.lang.String.substring(String.java:1940) 在 java.util.StringTokenizer.nextToken(StringTokenizer.java:335) 在 FilteringSNP_genus.main(FilteringSNP_genus.java:77)

谁能提供一些线索来解决这个问题?

谢谢

【问题讨论】:

  • 更多信息将不胜感激:主要是你的进程做了什么(它是一个“Hello world”坏了,或者它真的是一个可能需要所有内存的复杂系统)
  • 你能在FilteringSNP_genus.java:65周围发布代码

标签: java out-of-memory


【解决方案1】:

我发现如果找到内存的时间太长,GC 会放弃,即使内存确实在那里。最简单的问题是内存大部分是虚拟的,这比真实内存慢得多。此外,如果内存过于碎片化,GC 可能需要一些时间才能找到所需的空间。如果你要分配大块内存,那会使情况变得更糟。像这样的问题可能是间歇性的,当 GC 有时间清理房屋并保持一切井井有条时工作正常,当它过载时会失败。我的猜测是,在您的情况下,您要么有分页问题,​​要么您在太大的块中使用了过多的可用内存。

解决方案:获取更多实际内存(如果分页是问题)。使用更少的内存。使用较小的内存。数组是处理数字的最快方法,但带有指针的数据结构使 GC 的工作更轻松。如果你能找到一种方法来使用更小的数组(或不使用数组),那就去做吧。

应该有可能获得具有 8GB 或更多内存的适当 64 位系统(计算机和 JVM),这样您就可以忽略并忘记这个问题,但我还没有听说有人这样做。 (并且内存使用扩展以填充可用内存......)

【讨论】:

  • 我确定您的意思是 8GB,而不是 8MB。改了。
  • 谢谢。 (我希望没有人认为我记得当 8MB 是很多内存时。当我选择“G”时,我的手指刚刚滑落。)
  • 我记得 1MB 很多的时候 :-)
【解决方案2】:

我冒昧地猜测您正在从文件或套接字读取并使用readLine() 为方便起见而不考虑其含义。请改用reading into a char[] buffer。

或者,您正在读取行并将对它们的硬引用存储在内存中,因此一旦您阅读足够,您显然会用完空间。

至于GC开销错误,根据Oracle JVM article: “如果在垃圾收集上花费了太多时间,并行收集器将抛出 OutOfMemoryError:如果超过 98% 的总时间用于垃圾收集并且回收的堆少于 2%,则会抛出 OutOfMemoryError。 "

【讨论】:

  • 你在那儿发表的最后一句话我不知道。 +1 获取有趣和有用的信息!
猜你喜欢
  • 2018-06-13
  • 2014-05-15
  • 1970-01-01
  • 2012-06-20
  • 2019-03-09
  • 2017-12-27
  • 2020-09-08
  • 2020-07-24
相关资源
最近更新 更多