JVM內存調優

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

相關文章
相關標籤/搜索