簡體   English   中英

當ubuntu中的內存仍然可用時,發生Java內存不足

[英]Java Out of memory occured when memory is still available in ubuntu

據我所知,在linux系統中,高速緩存的內存用於提高Disk IO操作的性能,每當某些進程請求分配內存時,都會釋放該內存。

但是最近,我得到了OOM(內存不足),這導致我的Java應用程序關閉,而緩存的內存仍然可用(〜250MB),而我現有的Java應用程序Java堆為Xms:128MB和Xmx:256MB。 我捕獲了free -m命令和內核錯誤

free -m命令

內核錯誤

在這種情況下,您有什么想法嗎? 任何幫助都會很好。 謝謝

您能否發布完整的錯誤消息和Java版本?

它應該包含對耗盡的內存池(例如堆,permgen等)的一些描述,這些描述對於確定異常原因很有用。 操作系統級別的可用內存顯然是潛在原因之一(不是很常見)。 有關更多詳細信息,請參見https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html

大多數情況下,OOM不是由於OS級別上的可用內存引起的,因此可以簡單地避免將一堆對象添加到集合中來解決。

內存不足通常是由於JVM(主要是堆)內的空間耗盡所致。 例如,使用Xmx,您將堆限制為256m:如果您使用超過256m的對象保留引用,則堆空間將用完,因此會得到OOM。 對於帶有類或類加載泄漏的permgen來說,類似的東西。

堆是分配給JVM來承載對象的內存量,不應與OS內存混淆。 JVM以一定的堆大小(Xms)開始,然后向操作系統請求額外的內存,直到達到最大限制(Xmx)。 同時,垃圾收集器會清理內存(使用多種方法,具體取決於運行時條件,JVM版本,配置等)。 因此,您應該重新審視邏輯,避免將太多對象保留在內存中,或者增加Xmx。 類/代碼和其他內存池也會發生類似的情況(與jvm實現不同)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM