[英]Java Out of memory occured when memory is still available in ubuntu
您能否發布完整的錯誤消息和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.