Site icon Mr. 沙先生

Java 淺談 OutOfMemory 的 JVM Heap and PermGen 設定

在使用 Java 的時候相信都會遇到過 OutOfMemory 這個錯誤,在以前維護 Tomcat 的時候就常常遇到這個狀況,剛好最近又遇到了 紀錄一下這篇

 

What is the JVM ?

Jvm (Java Virtual Machine) 意旨 Java 虛擬機,用於執行 Java bytecode 的 Virtual Machine space,以堆疊結構機器的方式實作,將編譯過的 *.class 輸入到 JVM 並執行,以下是 JVM 架構圖:

 

jvm-architecture

 

以上圖所示,我們所知道 Jvm 與 OutOfMemory 有絕大多數關係的來自於 Heap Area

 

Heap space

OutOfMemoryError:Java heap space

一個 JVM instance 僅存在一個 heap space,也就是整個 instance 可執行的 All memory

JVM heap 的設定最大值與 OS big 限制有絕對的關係,32bit 最大只能設定約 1.5GB ~ 2GB 左右,64bit 則沒有限制。

-Xms1024m -Xmx2048m

 

 

PermGen space

OutOfMemoryError: PermGen space

PermGen space (Permanent Generation space) 指的是 Memory 的永久保留區,是存在於 JVM instance 裡面的其中一個 Memory zone,裡面存放著 Class、Meta info .. 等各種暫存的資料 and 狀態,這種錯誤常見發生於 class 在進行大量資料處理 or pre compile 等將 PermGen 塞爆了。

PermGen size 可以透過設定初始值與最大值調整

-XX:PermSize=128m -XX:MaxPermSize=256m

 

 

從這邊可以看到 Java 為何在於處理多線程的系統會有比較好的效率,就是在於 JVM and GC (垃圾回收) 的技術就是在於此。

 

 

 

Exit mobile version