2011-07-04 55 views
0

我在应用程序中遇到了内存不足问题。执行线程中“java.lang.OutofMemoryError”的可能原因是什么?

在我的线程执行的一个,突然有一种java.lang.OutofMemoryError,使该线程死亡。

我已经选择了应用程序的内存堆大小为20M。 在这个线程出现之前和之后,我已经抛出了整个应用程序的内存使用情况,它不超过20M。

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

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

这就是我得到的! 之前,这个应用程序的内存占用8M

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

+1

有很多潜在的原因。作为第一步,你能否发布错误的细节;说原因。 – kipz

+0

当您尝试分配无法放入堆的连续区域的内存块时,通常会发生OOM。因此,如果您的总内存使用量<20M并不意味着您不会(或不应该)获得OOM例外。你可以发布一些代码和堆栈跟踪? – dlev

+0

你运行的是哪个版本的Java?新版本允许您捕获更多信息。您也可以尝试将-XX:+ HeapDumpOnOutOfMemoryError添加到您的java命令以在发生错误时生成堆转储。 – developmentalinsanity

回答

1

原因是您的内存不足。这可能是几种之一,所以确切的信息是重要的。

您可以连接到您正在运行的程序与jvisualvm(在JDK)和调查对象树可看到存储到了哪里。希望你可以推断为什么它仍然被使用(可以像持有结构副本的静态域一样简单)以及如何摆脱它。

当你发现后,再放入试-finally语句,这样即使OOM被抛出的内存总是释放。

+0

我知道它在该线程上的内存不足。但是不知道如何在内存的整个应用程序尚未超过20M时发生这种情况。这是一个线程有限的内存大小是<20M? –

+0

您可能会遇到内存使用率高峰。显示堆栈跟踪。 –

+0

不幸的是,stacktrace不能打印给我。 –

1

它可能是因为你没有给你的应用程序足够的内存。

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

堆大小绝不会超过最大值。这是最大的手段。 ;)

+0

我做到了。因为要解决OOM问题,我尝试在一段时间间隔内转储出内存使用情况。我发现在发生java.lang.OutofMemoryError之前和之后,内存使用率只有8M。 –

+0

如果您尝试创建一个像'new byte [length]'这样的数组,并且长度等于或大于12M,这将是预期的行为。我会看看OOME发生的代码行。 –

相关问题