堆大小設置
JVM 中最大堆大小有三方面限制:
①、相關操作系統的數據模型(32-bt還是64-bit)限制;
②、系統的可用虛擬內存限制;
③、系統的可用物理內存限制.
32位系統 下,一般限制在1.5G~2G;64為操作系統對內存無限制.在Windows Server 2003 系統,3.5G物理內存,JDK5.0下測試,最大可設置為1478m.
堆內存邏輯上分為三部分:新生區+養老區+永久代
物理上分為兩部分:新生+養老
Jdk1.7之前,有永久代,但已經逐步“去永久代”
Jdk1.8之後,無永久代,由元空間替代典型設置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k①、-Xmx3550m:設置JVM最大可用內存為3550M.②、-Xms3550m:設置JVM促使內存為3550m.此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存.③、-Xmn2g:設置年輕代大小為2G.整個堆大小=年輕代大小 + 年老代大小 + 持久代大小.持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小.此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8.④、-Xss128k:設置每個線程的堆棧大小.JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需內存大小進行 調整.在相同物理內存下,減小這個值能生成更多的線程.但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右.
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0①、-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代).設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5②、-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值.設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6③、-XX:MaxPermSize=16m:設置持久代大小為16m.④、-XX:MaxTenuringThreshold=0:設置垃圾最大年齡.如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代. 對於年老代比較多的應用,可以提高效率.如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活 時間,增加在年輕代即被回收的概論.
回收器選擇JVM給瞭三種選擇:串行收集器,並行收集器,並發收集器,但是串行收集器隻適用於小數據量的情況,所以這裡的選擇主要針對並行收集器和並發收集器.默認 情況下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啟動時加入相應參數.JDK5.0以後,JVM會根據當前系統配置進行判斷.
吞吐量優先的並行收集器如上文所述,並行收集器主要以到達一定的吞吐量為目標,適用於科學技術和後臺處理等.
典型配置:
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20