本文來自于HeapDump性能社區(qū)! !有性能問題,上HeapDump性能社區(qū)!
正文:
Java 應(yīng)用程序在啟動期間獲得的內(nèi)存量有限。此限制是通過 -Xmx 和其他類似的啟動參數(shù)指定的。在 JVM 請求的總內(nèi)存大于可用物理內(nèi)存的情況下,操作系統(tǒng)開始將內(nèi)容從內(nèi)存換出到硬盤。
該java.lang.OutOfMemoryError:交換空間?error 表示交換空間也用完了,新的嘗試分配由于物理內(nèi)存和交換空間都不足而失敗。
1,是什么原因造成的?
該java.lang.OutOfmemoryError:交換空間?當(dāng)來自本機堆的字節(jié)分配請求失敗并且本機堆接近耗盡時,JVM 會拋出 . 該消息指示失敗的分配的大小(以字節(jié)為單位)以及內(nèi)存請求的原因。
問題出現(xiàn)在Java進程已經(jīng)開始交換的情況下,回顧Java是一種垃圾收集語言已經(jīng)不是一個好的情況。現(xiàn)代GC 算法做得很好,但是當(dāng)遇到由交換引起的延遲問題時,GC 暫停往往會增加到大多數(shù)應(yīng)用程序無法容忍的水平。
java.lang.OutOfMemoryError:交換空間不足?通常是由操作系統(tǒng)級別的問題引起的,例如:
- 操作系統(tǒng)配置的交換空間不足。
- 系統(tǒng)上的另一個進程正在消耗所有內(nèi)存資源。
應(yīng)用程序也可能由于本機泄漏而失敗,例如,如果應(yīng)用程序或庫代碼連續(xù)分配內(nèi)存但未將其釋放給操作系統(tǒng)。
2,解決辦法是什么?
要克服這個問題,您有幾種可能性。首先也是最簡單的解決方法是增加交換空間。實現(xiàn)此目的的方法是特定于平臺的,例如在 Linux 中,您可以使用以下示例命令序列來實現(xiàn),這些命令創(chuàng)建并附加一個大小為 640MB 的新交換文件:
swapoff -a
dd if=/dev/zero of=swapfile bs=1024 count=655360
mkswap swapfile
swapon swapfile
現(xiàn)在,您應(yīng)該回想一下,由于垃圾收集會清除內(nèi)存內(nèi)容,因此通常 Java 進程不希望交換。在交換分配上運行垃圾收集算法可以將GC 暫停的長度增加幾個數(shù)量級,因此在跳到簡單的解決方案潮流之前應(yīng)該三思而后行。
如果您的應(yīng)用程序部署在 JVM 需要與之競爭資源的“嘈雜鄰居”旁邊,您應(yīng)該將服務(wù)隔離到單獨的(虛擬)機器上。
在許多情況下,您唯一真正可行的選擇是升級機器以包含更多內(nèi)存或優(yōu)化應(yīng)用程序以減少其內(nèi)存占用。當(dāng)您轉(zhuǎn)向優(yōu)化路徑時,一個好的開始方法是使用內(nèi)存轉(zhuǎn)儲分析器來檢測內(nèi)存中的大量分配。
Java OOM系列專題:
第一篇:Java OOM 原理篇 : 什么是 Java OOM
第二篇:Java OOM 基礎(chǔ)篇:常見的OutOfMemoryError 場景一:Java heap space 堆溢出問題詳解
第三篇:Java OOM 基礎(chǔ)篇:常見的OutOfMemoryError 場景二 : GC overhead limit exceeded 問題詳解
第四篇:Java OOM 基礎(chǔ)篇:常見的OutOfMemoryError 場景三: PermGen space 永久空間問題詳解
第五篇:Java OOM 基礎(chǔ)篇:常見的OutOfMemoryError 場景四: Permgen size 元空間問題詳解
第六篇:Java OOM 實戰(zhàn)篇:應(yīng)用故障之Java heap space 堆溢出實戰(zhàn)