-Xms
,默認是物理內存的1/64;-Xmx
,默認是物理內存的1/4。默認空餘堆內存小於40%
時,JVM就會增大堆直到-Xmx
的最大限制;空餘堆內存大於70%
時,JVM會減小堆直到-Xms
的最小限制。所以服務器通常設置-Xms
、-Xmx
相等以免在每次GC 後調整堆的大小。html
-XX:PermSize
,默認是物理內存的1/64;-XX:MaxPermSize
,默認是物理內存的1/4。說明:java
若是 -Xmx
不指定或者指定偏小,應用可能會致使 java.lang.OutOfMemoryError
錯誤。web
若是-XX:MaxPermSize
設置太小會致使java.lang.OutOfMemoryError: PermGen space
就是內存益出。tomcat
爲何會內存益出?bash
Class
和Meta
的信息,Class
在被 Load的時候被放入PermGen space
區域,它和存放Instance
的Heap區域不一樣。PermGen space
進行清理,因此若是你的APP會LOAD不少CLASS 的話,就極可能出現PermGen space
錯誤。 這種錯誤常見在web服務器對 JSP 進行pre compile
的時候。JVM參數 | 說明 |
---|---|
-server | 必定要做爲第一個參數,在多個CPU時性能佳 |
-Xms | java Heap初始大小。 默認是物理內存的1/64。 |
-Xmx | java heap最大值。建議均設爲物理內存的一半。不可超過物理內存。 |
-Xmn | young generation的heap大小,通常設置爲Xmx的三、4分之一 |
-XX:PermSize | 設定內存的永久保存區初始大小,缺省值爲64M。 |
-XX:MaxPermSize | 設定內存的永久保存區最大 大小,缺省值爲64M。 |
-XX:SurvivorRatio | 生還者池的大小,默認是2,若是垃圾回收變成了瓶頸,您能夠嘗試定製生成池設置 |
-XX:NewSize | 新生成的池的初始大小。 缺省值爲2M。 |
-XX:MaxNewSize | 新生成的池的最大大小。 缺省值爲32M。若是 JVM 的堆大小大於 1GB,則應該使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者將堆的總大小的 50% 到 60% 分配給新生成的池。調大新對象區,減小Full GC次數。 |
-XX:+AggressiveHeap | 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。 參考 |
-Xss | 每一個線程的Stack大小,「-Xss 15120」 這使得JBoss每增長一個線程(thread)就會當即消耗15M內存,而最佳值應該是128K,默認值好像是512k. |
-verbose:gc | 現實垃圾收集信息 |
-Xloggc:gc.log | 指定垃圾收集日誌文件 |
-XX:userParNewGC | 可用來設置並行收集【多核CPU】 |
-XX:+UseSerialGC | 在新生代和老年代使用串行收集器 |
-XX:+UseParNewGC | 在新生代使用並行收集器,縮短minor收集的時間 |
-XX:+UseParallelGC | 新生代使用並行回收收集器,更加關注吞吐量【多核CPU】 |
-XX:+UseParallelOldGC | 老年代使用並行回收收集器 |
-XX:ParallelGCThreads | 設置用於垃圾回收的線程數【多核CPU】 |
-XX:+UseConcMarkSweepGC | 新生代使用並行收集器,老年代使用CMS+串行收集器 |
-XX:ParallelCMSThreads | 設定CMS的線程數量 |
-XX:+UseG1GC | 啓用G1垃圾回收器 |
具體在tomcat
的 catalina 的文件中進行配置:服務器
JAVA_OPTS="-server -Xms1024m -Xmx8192m -XX:PermSize=256M -XX:MaxPermSize=1024m -Dfile.encoding=utf-8"
複製代碼
另外須要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。jvm
收集垃圾能夠接受的速度與應用有關,應該經過分析實際的垃圾收集的時間和頻率來調整。若是堆的大小很大,那麼徹底垃圾收集就會很慢,可是頻度會下降。若是你把堆的大小和內存的須要一致,徹底收集就很快,可是會更加頻繁。性能
調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,爲保證最好的性能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程當中出現。測試
若是系統花費不少的時間收集垃圾,請減少堆大小。一次徹底的垃圾收集應該不超過 3-5 秒。若是垃圾收集成爲瓶頸,那麼須要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。ui
通常說來,你應該使用物理內存的 80% 做爲堆大小。當增長處理器時,記得增長內存,由於分配能夠並行進行,而垃圾收集不是並行的。
PS: 下面是個人IDEA對Java開發調優以後的配置:
-Xms2048m
-Xmx3072m
-XX:NewRatio=3
-Xss16m
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:ConcGCThreads=4
-XX:ReservedCodeCacheSize=240m
-XX:+AlwaysPreTouch
-XX:+TieredCompilation
-XX:+UseCompressedOops
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dfile.encoding=utf-8
複製代碼
參考: