狀況一:java.lang.OutOfMemoryError: Java heap spacejava
緣由:java堆內存不足,多是真的不足,也多是程序中有死循環多線程
方案:一、調整JVM參數-Xms2048m -Xmx2048mapp
二、定位死循環代碼jvm
狀況二:java.lang.OutOfMemoryError: GC overhead limit exceeded優化
緣由:JDK6新增錯誤類型,當GC爲釋放很小空間佔用大量時間時拋出;通常是由於堆過小,致使異常的緣由,沒有足夠的內存spa
方案:一、查看系統中是否有使用大內存的代碼或者死循環線程
二、添加jvm參數配置,來限制使用內存:-XX:-UseGCOverheadLimit設計
狀況三:java.lang.OutOfMemoryError: PermGen space遞歸
緣由:Perm區的內存不足內存
方案:-XX:MaxPermSize=128m -XX:PermSize=128m
狀況四:java.lang.OutOfMemoryError: Direct buffer memory
緣由:調整-XX:MaxDirectMemorySize= 參數
方案:-XX:MaxDirectMemorySize=128m
狀況五:java.lang.OutOfMemoryError: unable to create new native thread
緣由:Stack空間不足以建立額外的線程,要麼是建立的線程過多,要麼是Stack空間確實小了
方案:因爲JVM沒有提供參數設置總的stack空間大小,但能夠設置單個線程棧的大小;而系統的用戶空間一共是3G,除了Text/Data/BSS /MemoryMapping幾個段以外,Heap和Stack空間的總量有限,是此消彼長的。所以遇到這個錯誤,能夠經過兩個途徑解決:1.經過 -Xss啓動參數減小單個線程棧大小,這樣便能開更多線程(固然不能過小,過小會出現StackOverflowError);2.經過-Xms -Xmx 兩參數減小Heap大小,將內存讓給Stack(前提是保證Heap空間夠用)
狀況六:java.lang.StackOverflowError
緣由:這也內存溢出錯誤的一種,即線程棧的溢出,要麼是方法調用層次過多(好比存在無限遞歸調用),要麼是線程棧過小
方案:優化程序設計,減小方法調用層次;調整-Xss參數增長線程棧大小