JVM參數優化
JVM畢竟不是智能的,所以我們要根據實際的運行機器,實際業務等情況選擇合適的參數去優化JVM下面我講一些簡單的參數列下來,這些參數的使用需要先理解JVM內存模型,垃圾回收機制.
-
當堆需要擴展的時內存不夠會報 OutOfMemeryError: Heap(堆內存溢出) ,這時可能設置堆大小參數:
</li> </ol>-Xms=10M 設置堆的最小大小
-Xmx=20M 設置堆的最大大小
-Xmn=3M 設置年輕代的大小,如果設置太大會導致老年代太小,所以官方推薦為整個堆的3/8大小
-XX:HeapDumpPath=E:\Java\dump 設置堆轉儲文件的地址
-XX:+HeapDumpOnOutOfMemoryError 當發生堆內存溢出的時候生成堆轉儲文件,可以通過分析堆轉儲文件來找到溢出的原因
2.在經常動態生成大量Class的應用中,如使用Cglib增強,動態語言,大量Jsp文件 時,可能報OutOfMemeryError:PerGen space(方法區溢出).
-XX:PermSize:10M 設置方法區最小大小 //紅薯告訴我1.8的JDK已經把這個參數廢棄了
-XX:MaxPermsize 設置方法去最大大小 //紅薯告訴我1.8的JDK已經把這個參數廢棄了
3.垃圾回收器設置:
-XX:UseSerialGC 新生代使用Serial收集器,老年代使用Serial Old 收集器 .當JVM運行在Client模式下,默認打開.
-XX:UseParNewGC 新生代使用ParNew收集器,老年代使用Serial Old 收集器
-XX:UseConcMarkSweepGC 新生代使用ParNew收集器,老年代使用CMS,Serial Old,當老年代使用CMS出現Concurrent Mode Failure的時候才使用Serial Old收集器
-XX:ParallelGCThreads 由于ParNew收集器是多線程的,默認線程數就是內核數目,可以通過這個指定垃圾收集時線程數目
-XX:UseParallelGC 新生代使用Parallel Scavenge收集器,老年代使用Serial Old收集器,JVM運行在Server模式下,默認開啟.
-XX:UseParallelGC 新生代使用Parallel Scavenge收集器,老年代使用Parallel Old收集器
-XX:Maxtenuing Threshold 當新手代對象經過指定的次數就能進入老年代,默認為15.
-XX:printGCDetails 打印垃圾收集的日志
關于JVM的Client和Server模式.JVM有Client和Server模式,在Client模式下,啟動比較快,垃圾 收集器默認使用Serial + Serial Old.在Server模式下,啟動比較慢,默認使用Parallel Scanvenge + Serial Old.Client適用于桌面應用程序,用戶線程執行時間長,用戶體驗好.Server適用于服務器端,吞吐量高.
JVM會根據機器的內存以及CPU數量來判斷使用什么模式.通過java -version可以看到JVM使用什么模式.
當然也可以通過-client以及-server來指定JVM運行的模式.