JVM畢竟不是智能的,因此咱們要根據實際的運行機器,實際業務等狀況選擇合適的參數去優化JVM下面我講一些簡單的參數列下來,這些參數的使用須要先理解JVM內存模型,垃圾回收機制.java
當堆須要擴展的時內存不夠會報 OutOfMemeryError: Heap(堆內存溢出) ,這時可能設置堆大小參數:服務器
-Xms=10M 設置堆的最小大小
多線程
-Xmx=20M 設置堆的最大大小
優化
-Xmn=3M 設置年輕代的大小,若是設置太大會致使老年代過小,因此官方推薦爲整個堆的3/8大小
ui
-XX:HeapDumpPath=E:\Java\dump 設置堆轉儲文件的地址spa
-XX:+HeapDumpOnOutOfMemoryError 當發生堆內存溢出的時候生成堆轉儲文件,能夠經過分析堆轉儲文件來找到溢出的緣由線程
2.在常常動態生成大量Class的應用中,如使用Cglib加強,動態語言,大量Jsp文件 時,可能報OutOfMemeryError:PerGen space(方法區溢出).
日誌
-XX:PermSize:10M 設置方法區最小大小 //紅薯告訴我1.8的JDK已經把這個參數廢棄了server
-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運行的模式.