新生代填滿時,垃圾收集器會暫停全部的應用線程,回收新生代空間。這種操做被稱爲Minor GC。
老年代被填滿時,垃圾收集器會暫停全部應用線程,對其進行回收,接着對堆空間進行整理。這個過程被稱爲Full GC。
最主流的四個垃圾收集器分別是:Serial收集器、Throughput(或者Parallel)收集器、Concurrent(CMS、G1)垃圾收集器。Concurrent垃圾收集器能夠經過複雜的計算,能夠在應用線程運行的同時找出再也不使用的對象。
使用CMS或G1收集器時,應用程序精力的停頓會更少,所帶來的代價是消耗更多的CPU。
評估垃圾收集器時,應考慮如下幾點:算法
若是有額外的CPU處理能力,那麼使用Concurrent收集器將極大地提高應用程序的性能。
一般狀況下,parallel收集器的平均響應時間比Concurrent收集器要差,可是在90%響應時間或者99%響應時間這幾項指標上,parallel收集器比Concurrent收集器要好一些。
使用parallel收集器會超負荷地進行大量Full GC時,切換到Concurrent收集器一般能得到更低的響應時間。
通常狀況下,堆空間小於4GB時,CMS收集器的性能比G1收集器好。
G1的設計使得它可以在不一樣的分區處理堆,所以它的擴展性更好,比CMS更易於處理超大堆的狀況。多線程
一般狀況下,對於普通的操做系統,應該預留至少1G的內存空間。
堆的大小由2個參數值控制:分別是初始值(經過 -Xms N設置)和最大值(經過-Xms N設置)。
若是確切地瞭解應用程序須要多大的堆,那麼能夠將堆的初始值和最大值直接設置成對應的數據(譬如:-Xms4096m -Xmx4096m)。這種設置能稍微提升GC的運行效率,由於它再也不須要估算堆是否須要調整大小了。
任何事情都有兩面性,若是新生代分配得比較大,垃圾收集發生的頻率就比較低,重新生代晉升到老年代的對象也更少,可是老年代就相對比較小,比較容易被填滿,會更頻繁的觸發Full GC。
全部用於調整代空間的命令行標誌調整的都是新生代空間;新生代空間剩下的全部空間都被老年代佔用。
-XX:NewRatio=N
設置新生代與老年代的空間佔用比率
-XX:NewSize=N
設置新生代空間的初始大小
-XX:MaxNewSize=N
設置新生代空間的最大大小
-XmnN
將NewSize和MaxNewSize設定爲同一個值的快捷方法
最初的新生代的大小由NewRatio的決定,默認值爲2.
Initial Young Get Size = Initial Heap Size/(1 + NewRatio)
新生代空間的大小是初始堆大小的33%
多線程的垃圾收集器算法是由-XX:ParallelGCThreads=N
參數控制
總的垃圾收集器線程數 = 8 + (N - 8)* 5/8
有時候垃圾收集線程須要調整,例如在128C的機器上使用一個1G的堆,那麼會啓動83個線程,明顯就偏大了;又如在16C的機器同時運行4個JVM實例,那麼每一個JVM會啓動13個垃圾收集器線程,總共會有52個垃圾收集器線程,這樣會致使大量衝突,那麼將每一個JVM的垃圾收集器限制爲4個是一個比較合理的平衡。工具
-XX:+PrintGCDetails
建立詳細的GC日誌
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
GC時發生的日期,能夠配合上面的參數使用
-Xloggc:filename,能夠配合上面的參數使用
修改GC日誌輸出到某個文件
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=N
-XX:GCLogFileSize=N
能夠控制日誌文件的循環。NumberOfGCLogFiles產生日誌的個數,GCLogFileSize日誌的大小性能