JVM參數

Java 虛擬機基本結構
   {    類加載子系統        }  { Java棧   }
   {方法區  Java堆  直接內存}  {本地方法棧}
   {    垃圾回收系統        }  {PC 寄存器 }
   {           執行引擎                   }
   
 堆空間結構
 {eden  s0 s1}  {tenured}
         新生代         老年代
 
垃圾回收器對方法區、Java堆、直接內存進行回收

一個棧幀至少包含局部變量表、操做數棧、幀數據

GC DefNew :新生代 Tenured:老年代  Perm:永久區
Permanetjava

新生代GC稱爲Minor GC 數組

老年代GC稱爲Major GC併發

Full GC是對整個堆來講的,在最近幾個版本的JDK裏默認包括了對永生帶即方法區的回收(JDK8中無永生帶了),出現Full GC的時候常常伴隨至少一次的Minor GC,但非絕對的spa

 

一、System.gc()方法的調用.net

 此方法的調用是建議JVM進行Full GC,雖然只是建議而非必定,但不少狀況下它會觸發 Full GC,從而增長Full GC的頻率,也即增長了間歇性停頓的次數。強烈影響系建議能不使用此方法就別使用,讓虛擬機本身去管理它的內存,可經過經過-XX:+ DisableExplicitGC來禁止RMI調用System.gc線程

 

 

二、老年代代空間不足

 


老年代空間只有在新生代對象轉入及建立爲大對象、大數組時纔會出現不足的現象,當執行Full GC後空間仍然不足,則拋出以下錯誤:
java.lang.OutOfMemoryError: Java heap space
爲避免以上兩種情況引發的Full GC,調優時應儘可能作到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要建立過大的對象及數組。
設計

 

三、永生區空間不足

 


JVM規範中運行時數據區域中的方法區,在HotSpot虛擬機中又被習慣稱爲永生代或者永 生區,Permanet Generation中存放的爲一些class的信息、常量、靜態變量等數據,當系統中要加載的類、反射的類和調用的方法較多時,Permanet Generation可能會被佔滿,在未配置爲採用CMS GC的狀況下也會執行Full GC。若是通過Full GC仍然回收不了,那麼JVM會拋出以下錯誤信息:
java.lang.OutOfMemoryError: PermGen space
爲避免Perm Gen佔滿形成Full GC現象,可採用的方法爲增大Perm Gen空間或轉爲使用CMS GC
日誌

 

 

 

四、CMS GC時出現promotion failed和concurrent mode failure

對於採用CMS進行老年代GC的程序而言,尤爲要注意GC日誌中是否有promotion failed和concurrent mode failure兩種情況,當這兩種情況出現時可能對象

 

會觸發Full GC。
promotion failed是在進行Minor GC時,survivor space放不下、對象只能放入老年代,而此時老年代也放不下形成的;concurrent mode failure是在
blog

 

執行CMS GC的過程當中同時有對象要放入老年代,而此時老年代空間不足形成的(有時候「空間不足」是CMS GC時當前的浮動垃圾過多致使暫時性的空間不足觸發Full GC)。
對措施爲:增大survivor space、老年代空間或調低觸發併發GC的比率,但在JDK 5.0+、6.0+的版本中有可能會因爲JDK的bug29致使CMS在remark完畢

 

後好久才觸發sweeping動做。對於這種情況,可經過設置-XX: CMSMaxAbortablePrecleanTime=5(單位爲ms)來避免

 

 

五、統計獲得的Minor GC晉升到舊生代的平均大小大於老年代的剩餘空間

 


這是一個較爲複雜的觸發狀況,Hotspot爲了不因爲新生代對象晉升到舊生代致使舊生代空間不足的現象,在進行Minor GC時,作了一個判斷,若是之

 

前統計所獲得的Minor GC晉升到舊生代的平均大小大於舊生代的剩餘空間,那麼就直接觸發Full GC。
例如程序第一次觸發Minor GC後,有6MB的對象晉升到舊生代,那麼當下一次Minor GC發生時,首先檢查舊生代的剩餘空間是否大於6MB,若是小於6MB,

 

則執行Full GC。
當新生代採用PS GC時,方式稍有不一樣,PS GC是在Minor GC後也會檢查,例如上面的例子中第一次Minor GC後,PS GC會檢查此時舊生代的剩餘空間是否

 

大於6MB,如小於,則觸發對舊生代的回收。
除了以上4種情況外,對於使用RMI來進行RPC或管理的Sun JDK應用而言,默認狀況下會一小時執行一次Full GC。可經過在啓動時經過- java -

 

Dsun.rmi.dgc.client.gcInterval=3600000來設置Full GC執行的間隔時間或經過-XX:+ DisableExplicitGC來禁止RMI調用System.gc

 

 

 

 

六、堆中分配很大的對象

所謂大對象,是指須要大量連續內存空間的java對象,例如很長的數組,此種對象會直接進入老年代,而老年代雖然有很大的剩餘空間,可是沒法找到足夠大的連續空間來分配給當前對象,此種狀況就會觸發JVM進行Full GC。

爲了解決這個問題,CMS垃圾收集器提供了一個可配置的參數,即 -XX:+UseCMSCompactAtFullCollection開關參數,用於在「享受」完Full GC服務以後額外免費贈送一個碎片整理的過程,內存整理的過程沒法併發的,空間碎片問題沒有了,但提頓時間不得不變長了,JVM設計者們還提供了另一個 參數 -XX:CMSFullGCsBeforeCompaction,這個參數用於設置在執行多少次不壓縮的Full GC後,跟着來一次帶壓縮的。

以上內容來自 http://blog.csdn.net/chenleixing/article/details/46706039

如下參數爲本身整理
1\參數

    -Xms 堆初始空間  -Xmx5m


    -Xmx 最大堆空間  -Xmx20m


    -Xmn 新生代大小  通常爲堆大小的1/3 到1/4


    -Xss 最大棧空間


    -XX:SurvivorRatio 新生代中 eden空間和from/to空間比例關係


    -XX:NewRatio 新生代和老年代的比例


    -XX:PermSize 初始永久區大小


    -XX:MaxPermSize 最大永久區大小


    -XX:MaxDirectMemorySize 直接內存大小,不設置爲最大堆空間    

    打印GC日誌


    -XX:+PrintGC


    -XX:+PrintGCDetails


    查看堆信息
    -XX:+PrintHeapAtGC


    打印程序執行時間
    -XX:+PrintGCApplicationConcurrentTime


    打印程序因GC產生的停頓時間
    -XX:+PrintGCApplicationStoppedTime


    跟蹤類卸載
    -XX:+TraceClassUnloading


    跟蹤類加載
    -XX:+TraceClassLoading


    打印顯示參數        
    -XX:PrintVMOptions


    打印顯示參數和隱式參數        
    -XX:PrintCommandLineFlags


2\與串行回收器相關的參數

    -XX:+UseSerialGC : 在新生代和老年代使用串行收集器

    -XX:SurvivorRatio :設置eden區大小和survivior區大小的比例       -XX:PretenureSizeThreshold :設置大對象直接進入老年代的閾值。    當對象的大小超過這個值時,將直接在老年代分配        -XX:MaxTenuringThreshold : 設置對象進入老年代的年齡的最大值。每一次Minor GC後,對象年齡就加1。    任何大於這個年齡的對象,必定會進入老年代3\與並行GC相關的參數    -XX:+UseParNewGC:在新生代使用並行收集器    -XX:+UseParallelOldGC:老年代使用並行回收收集器    -XX:Para11e1GCThreads:設置用於垃圾回收的線程數。經過狀況下能夠和CPU數量相等,    但在CPU數量比較多的狀況下,設置相對較小的數值也是合理的    -XX:MaxGCPauseMillis:設置最大垃圾收集停頓時間。它的值是一個大於0的整數,收集器在工做時,    會調整Java堆大小或者其餘一些參數,儘量地把停頓時間控制在MaxGCPauseMillis 之內    -XX:GCTimeRatio:設置吞吐量大小。它的值是一個0到100之間的整數。假設GCTimeRatio的值爲n,麼系統將花費不超過1/(1+n)的時間用於垃圾收集     -XX:+UseAdaptiveSizePolicy:打開自適應GC策略。在這種模式下,新生代的大小、eden 和survivior的比例、    晉升老年代的對象年齡等參數會被自動調整,    以達到在堆大小、吞吐量和停頓時間之間的平衡點。4\與CMS回收器相關的參數   -XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器   -XX:Para11e1CMSThreads:設定CMS的線程數量    -XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少後觸發,默認爲68%   -XX:+UseCMSCompactAtFul1Collection:設置CMS收集器在完成垃圾收集後是否要進行一次內存碎片的整理   -XX:CMSFul1GCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次內存壓縮      -XX:+CMSClassUnloadingEnabled:容許對類元數據區進行回收。   -XX:CMSInitiatingPermOccupancyFraction:當永久區佔用率達到達必定百分比時,   啓動CMS回收(前提是-XX:+CMSClassUnloadingEnabled激活了)   -XX:UseCMSInitiatingOccupancyOnly:表示只在到達閾值的時候才進行CMS回收。   -XX:+CMSIncrementa1Mode:使用增量模式,比較適合單CPU。   增量模式在JDK8中標記爲廢棄,而且將在JDK9中完全移除 5\與G1回收器相關的參數    -XX:+UseG1GC:使用G1回收器     -XX:MaxGCPauseMillis:設置最大垃圾收集停頓時間        -XX:GCPauseInterva1Millis:設置停頓間隔時間。6\TLAB相關    -XX:+UseTLAB : 開啓TLAB分配。    -XX:+PrintTLAB:打印TLAB相關分配信息。    -XX:TLABSIze:設置TLAB大小    -XX:+ResizeTLAB;自動調整TLAB大小。6\其餘參數    -XX:+DisableExplicitGC:禁用顯式GC。    -XX:+ExplicitGCInvokesConcurrent:使用併發方式處理顯式GC

相關文章
相關標籤/搜索