1. 程式人生 > >常見的 Java 記憶體溢位解決方案

常見的 Java 記憶體溢位解決方案

一、 java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢位

JVM 在啟動的時候會自動設定 JVM Heap 的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)不可超過實體記憶體。可以利用 JVM提供的 -Xmn -Xms -Xmx 等選項可進行設定。Heap 的大小是 Young Generation 和 Tenured Generaion 之和。在 JVM 中如果 98% 的時間是用於 GC,且可用的 Heap size 不足 2% 的時候將丟擲此異常資訊。

解決方法:手動設定 JVM Heap(堆)的大小。
二、 java.lang.OutOfMemoryError: PermGen space —- PermGen space溢位。

PermGen space 的全稱是 Permanent Generation space,是指記憶體的永久儲存區域。為什麼會記憶體溢位,這是由於這塊記憶體主要是被 JVM 存放Class 和 Meta 資訊的,Class 在被 Load 的時候被放入 PermGen space 區域,它和存放 Instance 的 Heap 區域不同,sun 的 GC 不會在主程式執行期對 PermGen space 進行清理,所以如果你的 APP 會載入很多 CLASS 的話,就很可能出現 PermGen space 溢位。

解決方法: 手動設定 MaxPermSize 大小

三、 java.lang.StackOverflowError —- 棧溢位

棧溢位了,JVM 依然是採用棧式的虛擬機器,這個和 C 一樣。函式的呼叫過程都體現在堆疊和退棧上了。呼叫建構函式的 “層”太多了,以致於把棧區溢位了。通常來講,一般棧區遠遠小於堆區的,因為函式呼叫過程往往不會多於上千層,而即便每個函式呼叫需要 1K 的空間(這個大約相當於在一個 C 函式內聲明瞭 256 個 int 型別的變數),那麼棧區也不過是需要 1MB 的空間。通常棧的大小是 1-2MB 的。
通常遞迴也不要遞迴的層次過多,很容易溢位。