常見的內存溢出的三種情況

常見的內存溢出的三種情況:

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. 所以Server容器啓動的時候我們經常關心和設置JVM的幾個參數如下(詳細的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″

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章