最近在看JVM垃圾收集相關的內容,發現了《深入理解JAVA虛擬機》的描述不太容易理解;原文如下:
GCTimeRatio參數的值應當是一個大于0且小于100的整數,也就是垃圾收集時間占總時間的比率,相當于是吞吐量的倒數。如果把此參數設置為19,那允許的最大GC時間就占總時間的5%(即1/(1+19)),默認值為99,就是允許最大1%(即1/(1+99))的垃圾收集時間。
而書中吞吐量的公式為:吞吐量=用戶程序的運行時間/ (垃圾收集時間 + 用戶程序的運行時間);和上面提到的計算公式不匹配;所以感覺這里的描述是有問題的;后來查詢官方文檔:The Parallel Collector,官方關于GCTimeRatio的描述如下:
Throughput: The throughput goal is measured in terms of the time spent doing garbage collection versus the time spent outside of garbage collection, referred to as Application time. The goal is specified by the command-line option -XX:GCTimeRatio=<N>, which sets the ratio of garbage collection time to application time to 1 / (1 + <N>)
For example, -XX:GCTimeRatio=19 sets a goal of 1/20 or 5% of the total time in garbage collection. The default value is 99, resulting in a goal of 1% of the time in garbage collection
描述中有一句話比較關鍵:which sets the ratio of garbage collection time to application time to 1 / (1 + <N>); which指代GCTimeRatio參數,后面的描述說明可以通過這個參數計算垃圾收集時間占用應用程序時間的比例,公式為 : 1/(1+ GCTimeRatio的值)。從字面上可以看出,GCTimeRatio的作用是為了計算垃圾收集的時間占用程序運行時間的值;而GCTimeRatio應該理解為用戶程序的運行時間與垃圾收集時間的比例,即GCTimeRatio = userTime/GCTime, 其中userTime表示用戶程序運行時間,GCTime表示垃圾收集程序運營時間;
下面進行驗證
當GCTimeRatio=19時, 我們通過GCTimeRatio = userTime/GCTime(對參數進行假設的公式)可以得到userTime= 19GCTime, 再代入吞吐量計算公式:
公式1: 吞吐量=用戶程序的運行時間/ (垃圾收集時間 + 用戶程序的運行時間)
公式2:垃圾的運行時間/ (垃圾收集時間 + 用戶程序的運行時間) + 吞吐量 = 1
代入公式1 可得 吞吐量 = userTime /(GCTime + userTime) --> 19GCTime / (GCTime + 19GCTime) --> 19/(1+19);
公式1的結果代入公式2,可得 垃圾收集的運行時間 / (垃圾收集時間 + 用戶程序的運行時間) = 1- 吞吐量 = 1- [19/(1+19)] = 1/(1 + 19); 和官方描述的公式一致;
總上所述:GCTimeRatio應該理解為用戶程序的運行時間與垃圾收集時間的比例,即GCTimeRatio = userTime/GCTime, 其中userTime表示用戶程序運行時間,GCTime表示垃圾收集程序運營時間;