有關OutOfMemoryError的緣由及處理

堆溢出java

會出現java.lang.OutOfMemoryError,緊接着還會跟一條Java heap space,at…多線程

先經過內存映像分析工具堆dump出來的堆快照分析,分清楚是內存泄漏仍是內存溢出工具

對於內存泄漏,查一下GC Roots的引用鏈,掌握泄露對象的類型信息及GC Roots引用鏈的信息,定位出問題的地方spa

對於內存溢出,看看-Xms和-Xmx,看看能不能調大,從代碼上檢查是否有些對象生命週期過長等線程

虛擬機棧和本地方法溢出對象

Hotspot中不區分虛擬機棧和本地方法棧,因此對於它來講-Xoss(設置本地方法棧大小)沒啥用,棧容量只由-Xss來設置生命週期

通常來講,默認的Xss夠用了,並且即便爆棧也會有足夠的提示來解決,有的32位系統受限於尋址能力,由於多線程引發爆棧,有時候須要減小Xmx和減小棧容量來換取更多的線程內存

運行時常量池溢出和方法區溢出虛擬機

因爲常量池分配在方法區內,能夠經過-XX:MaxPermSize和-XX:MaxPermSize來限制方法區大小達到間接限制常量池的目的內存泄漏

運行時常量池溢出也會拋OOM,可是後面提示的信息是PermGen space,說明運行時常量池屬於方法區,也就是Hotspot中用就帶的一部分

本機直接內存溢出

能夠經過-XX:MaxDirectMemorySize指定,若是不指定默認與Java堆的最大值-Xmx同樣,雖然用DirectByteBuffer分配內存也會致使溢出,可是拋異常時只是經過計算得知沒法分配,並無真正向OS申請分配內存,真正申請分配內存的方法是unsafe.allocateMemory()

相關文章
相關標籤/搜索