2017-08-28 89 views
1

據我所知,在linux系統中,爲了提高磁盤IO操作的性能,它會在某些進程請求分配內存時被釋放。但是最近,我得到了OOM(內存不足)導致關閉我的Java應用程序,同時緩存的內存仍然可用(〜250MB),而我現有的Java應用程序Java堆是Xms:128MB和Xmx:256MB。我拍攝的免費-m命令和內核錯誤Java當內存在ubuntu中仍然可用時出現內存不足

free -m command

kernel error

你有沒有在這種情況下,任何想法。任何幫助都會很好。謝謝

回答

0

請問您可以發佈完整的錯誤信息和java版本嗎?

它應該包含用於確定異常原因的耗盡內存池(即堆,permgen等)的一些描述。 操作系統級別的可用內存是可能的原因之一(不是非常頻繁)。 查看https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html瞭解更多詳情。

大多數情況下,OOM並非歸因於操作系統級別的內存,只能避免向集合中添加一堆對象。

OutOfMemory通常是由於JVM中的空間耗盡(通常是堆)。 即使用Xmx,您將堆棧限制爲256m:如果您保留超過256m的對象的引用,那麼您將耗盡堆空間並因此獲得OOM。與類或類加載泄漏類似的東西。

堆是指向JVM分配給主機對象的內存量,不應與OS內存混淆。 JVM以特定的堆大小(Xms)開始,然後向OS請求額外的內存,直到達到最大限制(Xmx)。與此同時,垃圾收集器清理內存(使用多種方法,基於運行時間條件,JVM版本,配置等)。因此,您應該重新審視自己的邏輯並避免將過多對象保留在內存中,或者增加Xmx。 類/代碼和其他內存池發生類似的情況(隨jvm實現而變化)。

如果您遇到內存泄漏,你可以使用http://www.eclipse.org/mat/https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks001.html

+0

同意分析分配的內存。我可以添加「給java版本」,因爲內存/ GC架構的變化 –

+0

@JacekCz肯定,添加 –