2011-07-04 52 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發生的代碼行。 –

相關問題