【问题标题】:What is the possible causes of "java.lang.OutofMemoryError" in a executing thread?执行线程中“java.lang.OutofMemoryError”的可能原因是什么?
【发布时间】:2011-07-04 15:46:23
【问题描述】:

我在我的应用程序中遇到了内存不足的问题。

在我的一个线程执行中,突然出现java.lang.OutofMemoryError 并使该线程死亡。

我已经为应用程序选择了内存堆大小为 20M。 我已经在这个线程上发生这个OOM之前和之后转储了整个应用程序的内存使用量,它不超过20M。

我不知道如何解决这个问题。

那么java.lang.OutofMemoryError 的可能原因是什么?如果我不知道确切原因,有什么方法可以解决吗?

这就是我得到的! 在此之前应用的内存使用量是8M

这个应用程序的内存使用量也是8M。

【问题讨论】:

  • 有很多潜在的原因。作为第一步,您能否发布错误的详细信息?说出原因。
  • OOM 通常发生在您尝试分配无法放入堆的连续区域的内存块时。因此,您的总内存使用量
  • 您在哪个版本的 Java 上运行?较新的版本允许您捕获更多信息。您也可以尝试在 java 命令中添加 -XX:+HeapDumpOnOutOfMemoryError 以在发生错误时生成堆转储。
  • J2SE 1.4.2。它可能有点老......

标签: java memory-leaks out-of-memory


【解决方案1】:

原因是内存不足。然而,这可能是几种类型中的一种,因此确切的信息很重要。

您可以使用 jvisualvm(在 JDK 中)附加到正在运行的程序并调查对象树以查看内存的去向。希望您能推断出为什么仍然使用它(可以像保存结构副本的静态字段一样简单)以及如何摆脱它。

当你发现时,然后放入 try-finally 子句,以便即使抛出 OOM 也总是释放内存。

【讨论】:

  • 我知道该线程内存不足。但是不知道在整个内存应用程序还没有超过 20M 的情况下会发生这种情况。线程的内存大小是否有限,
  • 您可能会遇到内存使用高峰。显示堆栈跟踪。
  • 不走运,堆栈跟踪不为我打印。
【解决方案2】:

可能是因为您没有为应用程序提供足够的内存。

我已经为应用程序选择了内存堆大小为 20M。我已经在这个线程上发生这个OOM之前和之后转储了整个应用程序的内存使用量,它不超过20M。

堆大小永远不会超过最大值。这就是拥有最大值的意思。 ;)

【讨论】:

  • 我做到了。因为为了解决 OOM,我尝试在一段时间内转储内存使用量。发现java.lang.OutofMemoryError发生前后,内存占用只有8M。
  • 如果您尝试创建一个类似new byte[length] 的数组并且长度为 12M 或更多,这将是预期的行为。我会查看发生 OOME 的代码行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2013-02-16
  • 2021-09-01
  • 2012-01-01
相关资源
最近更新 更多