Java堆溢位
現象
- java.lang.OutOfMemoryError: Java heap space
原因
- 大量物件沒有釋放,無法回收
解決方案
- 使用記憶體映像分析工具分析 Dump 出來的堆轉儲快照,分析物件是是否合理存在,可以排查是記憶體泄露還是溢位
- 如果記憶體泄露,工具查看泄漏物件到 GC Root 的參考鏈,定位出泄漏的位置;
- 如果不存在泄漏,檢查虛擬機堆引數(-Xmx 和 -Xms)是否可以調大
配置
- 配置 -XX:HeapDumpOnOutOfMemoryError,在發生記憶體溢位會存盤快照用于事后分析
Java 虛擬機堆疊和本地方法堆疊溢位
原因
- 單執行緒下,堆疊幀過大或記憶體過小,都不會導致OutOfMemoryError,只會導致StackOverflowError(堆疊會比記憶體先出問題)
- 多執行緒情況下會導致OutOfMemoryError,因為多個執行緒本身要占用記憶體
解決方案(多執行緒情況)
- 更換64位虛擬機
- 減少最大堆和堆疊容量換取更多的執行緒
直接記憶體溢位
現象
- Heap Dump 檔案中看不見明顯例外,程式中直接或間接用了 NIO
解決方案
- 提高直接記憶體大小 -XX:MaxDirectMemorySize,沒有沒有指定默認和-Xmx一致
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/170090.html
標籤:其他
