在使用 Java 的時候相信都會遇到過 OutOfMemory 這個錯誤,在以前維護 Tomcat 的時候就常常遇到這個狀況,剛好最近又遇到了 紀錄一下這篇
What is the JVM ?
Jvm (Java Virtual Machine) 意旨 Java 虛擬機,用於執行 Java bytecode 的 Virtual Machine space,以堆疊結構機器的方式實作,將編譯過的 *.class 輸入到 JVM 並執行,以下是 JVM 架構圖:
以上圖所示,我們所知道 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 (垃圾回收) 的技術就是在於此。