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的程序而言,尤爲要注意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)來避免
這是一個較爲複雜的觸發狀況,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