“可能的原因是什么?”;java.lang.OutofMemoryError“;在执行线程中?

“可能的原因是什么?”;java.lang.OutofMemoryError“;在执行线程中?,java,memory-leaks,out-of-memory,Java,Memory Leaks,Out Of Memory,我在应用程序中遇到了内存不足的问题 在我的一个线程执行中,突然出现了java.lang.OutofMemoryError,并使该线程死亡 我已经选择应用程序的内存堆大小为20M。 在这个线程上的OOM发生之前和之后,我已经转储了整个应用程序的内存使用量,它不超过20M 我不知道如何解决这个问题 那么,导致java.lang.OutofMemoryError的可能原因是什么呢?如果我不知道确切的原因,有什么方法可以解决吗 这就是我得到的! 在此之前,应用程序的内存使用率为8M 在此之后,应用程序的

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

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

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

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

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

这就是我得到的! 在此之前,应用程序的内存使用率为8M


在此之后,应用程序的内存使用量也将达到8M。

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

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


当您发现这一点时,请输入try-finally子句,这样即使抛出OOM,内存也会一直释放。

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

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


堆大小永远不会超过最大值。这就是最大化的意思

有许多潜在的原因。作为第一步,您能否发布错误的详细信息;假设cause.OOM通常发生在您试图分配一个无法放入堆的连续区域的内存块时。因此,总内存使用量<20M并不意味着不会(或不应该)出现OOM异常。你能发布一些代码和堆栈跟踪吗?你运行的是什么版本的Java?较新的版本允许您捕获更多信息。您还可以尝试将-XX:+HeapDumpOnOutOfMemoryError添加到java命令中,以便在出现错误时生成堆转储。J2SE 1.4.2。它可能有点老了…我知道在那个线程上它已经没有内存了。但不知道在整个内存应用程序还不超过20M的情况下怎么会发生这种情况。一个线程的内存大小是有限的,这可能会导致内存使用高峰。显示stacktrace。不幸的是,stacktrace没有为我打印。我打印了。因为为了处理OOM,我尝试在一段时间间隔内转储内存使用量。我发现在java.lang.OutofMemoryError发生前后,内存使用量仅为8M。如果您尝试创建一个数组,如
new byte[length]
,并且长度为12M或更大,这将是预期的行为。我将查看OOME出现的代码行。