JVM的常見配置彙總java
堆設置:併發
-Xms:初始堆大小 通常設置爲小於4Gide
-Xmx:最大堆大小 通常設置爲小於4G工具
通常-Xms與Xmx的值相等,避免每次垃圾回收完成後JVM從新分配內存操作系統
-XX:NewSize=n 設置年輕代大小線程
-XX:NewRatio=n 設置年輕代和年老代的比值設計
若是設置了-XX:NewSize,那麼久不在設置-XX:NewRatio遞歸
收集器的設置內存
-XX:+UseParallelGC:設置並行收集器資源
-XX:+UseConcMarkSweepGX:設置併發收集器
垃圾回收統計信息
-XX:+PrintGC
並行收集器設置:
-XX:ParallelGCThreads=n 根據CPU核數來設置。並行收集線程數
配置舉例:
系統的可用武力內存限制:32位系統下,通常限制在1.5G-2G;
64位操做系統對內存無限制,可是通常設置在4G左右
典型設置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmn2g:持久代通常固定大小爲64m
回收器的選擇:
JDK5.0之後,JVM會根據當前系統配置進行判斷
使用併發收集器時,開啓對年老代的
JVM調優工具:
Jconsole、VisualVM:JDK自帶
持久代被佔滿:
異常:java.lang.OutOfMeoryError:PermGen Space
Perm空間被佔滿,沒法爲新的
解決辦法:
1.-XX:MaxPermSize=16m
堆棧溢出
異常:java.lang.StackOverflowerror
說明:通常就是遞歸沒返回,或者循環調用形成
線程堆棧滿
異常:Fatal:Stack size too small
說明:java中一個線程的空間大小是有限制的。JDK5.0之後這個值是1M。與這個線程相關的數據將會保存其中。但當線程空間滿了之後,會出現上面異常
解決:增長線程棧大小。-Xss2m。可是這個配置沒法解決根本問題,還要看代碼部分是否有形成泄漏的部分
系統內存被佔滿
異常:java.lang.OutOfMeoryError:unable to create new native thread
說明:這個異常是因爲操做系統沒有足夠的資源來產生這個線程形成的。系統建立線程時,除了要在Java堆中分配內存外,操做系統自己也須要分配資源來建立線程。所以,當線程數量大道必定程度之後,堆中或許還有空間,可是操做系統分配不出資源來了,就出現這個異常了。
經過修改-Xss來減小分配給單個線程的空間,也能夠增長系統總共內生產的線程數。
解決:
1.從新設計系統減小線程數量
2.經過-Xss改變大小
經常使用命令:
jmap head
jmap -permstat
jmap -dump