(出處: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 Generation與Old Generation所占比值為1:4,New Generation占整個Stack的1/5。
-XX:SurvivorRatio=4:將New Generation中Eden區與Survivor區的大小比值設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個New Generation的1/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即被回收的概論。
-XX:NewRatio=4:設置New Generation (包括Eden和兩個Survivor區)與Old Generation的比值.設置為4,則New Generation與Old Generation所占比值為1:4,New Generation占整個Stack的1/5。
-XX:SurvivorRatio=4:將New Generation中Eden區與Survivor區的大小比值設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個New Generation的1/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即被回收的概論。
沒有留言:
張貼留言