java常見的幾種記憶體溢位和解決方案

業餘草發表於2015-09-17
專案組最近在開發中經常會出現一些意想不到的記憶體溢位問題。下面我就說說我們常見的幾種記憶體溢位吧!
1.JVM Heap(堆)溢位:java.lang.OutOfMemoryError: Java heap space
JVM在啟動的時候會自動設定JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時間是用於GC,且可用的Heap size 不足2%的時候將丟擲此異常資訊。
解決方法:手動設定JVM Heap(堆)的大小。
2.PermGen space溢位: java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域。為什麼會記憶體溢位,這是由於這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,sun的 GC不會在主程式執行期對PermGen space進行清理,所以如果你的APP會載入很多CLASS的話,就很可能出現PermGen space溢位。一般發生在程式的啟動階段。
解決方法: 通過-XX:PermSize和-XX:MaxPermSize設定永久代大小即可。
3.棧溢位: java.lang.StackOverflowError : Thread Stack space
棧溢位了,JVM依然是採用棧式的虛擬機器,這個和C和Pascal都是一樣的。函式的呼叫過程都體現在堆疊和退棧上了。呼叫建構函式的 “層”太多了,以致於把棧區溢位了。 通常來講,一般棧區遠遠小於堆區的,因為函式呼叫過程往往不會多於上千層,而即便每個函式呼叫需要 1K的空間(這個大約相當於在一個C函式內宣告瞭256個int型別的變數),那麼棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。通俗一點講就是單執行緒的程式需要的記憶體太大了。 通常遞迴也不要遞迴的層次過多,很容易溢位。
解決方法:1:修改程式。2:通過 -Xss: 來設定每個執行緒的Stack大小即可。
4.but has failed to stop it. This is very likely to create a memory leak.
這一般是啟動程式時一些定時器或其他正在操作的執行緒還沒有停掉造成的。
解決方法:實現ServletContextListener的監聽,在contextDestroyed方法中進行關閉。
5. 所以Server容器啟動的時候我們經常關心和設定JVM的幾個引數如下:
-Xms:java Heap初始大小, 預設是實體記憶體的1/64。
-Xmx:ava Heap最大值,不可超過實體記憶體。
-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一 。增大年輕代後,將會減小年老代大小,可以根據監控合理設定。
-Xss:每個執行緒的Stack大小,而最佳值應該是128K,預設值好像是512k。
-XX:PermSize:設定記憶體的永久儲存區初始大小,預設值為64M。
-XX:MaxPermSize:設定記憶體的永久儲存區最大大小,預設值為64M。
-XX:SurvivorRatio:Eden區與Survivor區的大小比值,設定為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區佔整個年輕代的1/10
-XX:+UseParallelGC:F年輕代使用併發收集,而年老代仍舊使用序列收集.
-XX:+UseParNewGC:設定年輕代為並行收集,JDK5.0以上,JVM會根據系統配置自行設定,所無需再設定此值。
-XX:ParallelGCThreads:並行收集器的執行緒數,值最好配置與處理器數目相等 同樣適用於CMS。
-XX:+UseParallelOldGC:年老代垃圾收集方式為並行收集(Parallel Compacting)。
-XX:MaxGCPauseMillis:每次年輕代垃圾回收的最長時間(最大暫停時間),如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。
-XX:+ScavengeBeforeFullGC:Full GC前呼叫YGC,預設是true。

例項如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″

好了就到這裡吧!歡迎大家關注我的部落格,如有疑問,請加qq群:454796847、135430763 共同進步!

相關文章