回覆列表
  • 1 # 藍風24

    Java常見的幾種記憶體溢位及解決方法【情況一】:

    java.lang.OutOfMemoryError:Javaheapspace:這種是java堆記憶體不夠,一個原因是真不夠(如遞迴的層數太多等),另一個原因是程式中有死迴圈;

    如果是java堆記憶體不夠的話,可以透過調整JVM下面的配置來解決:

    -Xms3062m

    -Xmx3062m

    【情況二】

    java.lang.OutOfMemoryError:GCoverheadlimitexceeded

    【解釋】:JDK6新增錯誤型別,當GC為釋放很小空間佔用大量時間時丟擲;一般是因為堆太小,導致異常的原因,沒有足夠的記憶體。

    【解決方案】:

    1、檢視系統是否有使用大記憶體的程式碼或死迴圈;

    2、透過新增JVM配置,來限制使用記憶體:

    -XX:-UseGCOverheadLimit

    【情況三】:

    java.lang.OutOfMemoryError:PermGenspace:這種是P區記憶體不夠,可透過調整JVM的配置:

    -XX:MaxPermSize=128m

    -XXermSize=128m

    【注】:

    JVM的Perm區主要用於存放Class和Meta資訊的,Class在被Loader時就會被放到PermGenspace,這個區域成為年老代,GC在主程式執行期間不會對年老區進行清理,預設是64M大小,當程式需要載入的物件比較多時,超過64M就會報這部分記憶體溢位了,需要加大記憶體分配,一般128m足夠。

    【情況四】:

    java.lang.OutOfMemoryError:Directbuffermemory

    調整-XX:MaxDirectMemorySize=引數,如新增JVM配置:

    -XX:MaxDirectMemorySize=128m

    【情況五】:

    java.lang.OutOfMemoryError:unabletocreatenewnativethread

    【原因】:Stack空間不足以建立額外的執行緒,要麼是建立的執行緒過多,要麼是Stack空間確實小了。

    【解決】:由於JVM沒有提供引數設定總的stack空間大小,但可以設定單個執行緒棧的大小;而系統的使用者空間一共是3G,除了Text/Data/BSS/MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以透過兩個途徑解決:1.透過-Xss啟動引數減少單個執行緒棧大小,這樣便能開更多執行緒(當然不能太小,太小會出現StackOverflowError);2.透過-Xms-Xmx兩引數減少Heap大小,將記憶體讓給Stack(前提是保證Heap空間夠用)。

  • 中秋節和大豐收的關聯?
  • 項鍊是買黃金還是白金的好?