2012年4月16日 星期一

Jjava 記憶體參數說明

JVM的記憶體空間如下:

(出處:http://www.sapgeek.net/2010/11/java-jvm-memory-structure/)



METHOD AREA:存放要載入類別的各種資訊,當要使用的記憶體超出允許的大小時,會抛出OutOfMemory的錯誤資訊,在JDK中這塊區域對應Permanet Generation,預設最小值為16MB,最大值為64MB,可透過-XX:PermSize-XX:MaxPermSize來指定最小值和最大值!

HEAP:Heap用於儲存物件實例及陣列值,可認為Java中所有透過new建立物件都在此分配,在32bit電腦上最大限制為2GB,64bit無此限制,可透過-Xms-Xmx控制!HEAP有包含New Generation及Old Generation:

  • New Generation:可透過-Xmn指定大小
  • Old Generation:即-Xmx減去-Xmn的大小
NATIVE METHOD STACK:儲存每個native method呼叫的狀態,如C

JAVA STACK & PROGRAM COUNTER REGISTER:PC REGISTER存放的為CPU暫存器或OS記憶體;JAVA STACK存放的為OS記憶體,當JAVA STACK不足時會抛出StackOverflowError,可透過-Xss指定大小!

JDK參數設定策略:

一般設置

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:設置JVM最大可用記憶體為3550M.
-Xms3550m:設置JVM促使記憶體為3550m.此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體.
-Xmn2g:設置New Generation大小為2G.整個stack大小 = New Generation + Old Generation
!此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8
-Xss128k:設置每個執行緒的Stack大小。JDK5.0以後每個執行緒Stack大小為1M,以前每個執行緒Stack大小為256K!更具應用的執行緒所需記憶體大小進行調整。在相同實體記憶體下!減小這個值能生成更多的執行緒。但是作業系統對一個進程內的執行緒數還是有限制的。不能無限生成,大約在3000~5000左右。


java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4
:設置New Generation (包括Eden和兩個Survivor)Old Generation的比值.設置為4,則New GenerationOld Generation所占比值為1:4New Generation占整個Stack1/5
-XX:SurvivorRatio=4:New GenerationEden區與Survivor區的大小比值設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個New Generation1/6
-XX:MaxPermSize=16m
:設置Permanet Generation大小為16m
-XX:MaxTenuringThreshold=0:設置垃圾最大年齡.如果設置為0的話,New Generation物件不經過Survivor,直接進入Old Generation。對於Old Generation有比較多的應用話可以提高效率。如果將此值設置為一個較大值,New Generation物件會在Survivor區進行多次複製,這樣可以增加物件再New Generation的存活時間,減少在New Generation即被回收的概論。

沒有留言: