Mercurial HG
分佈式軟件配置管理工具 - 水銀
首先花2分鐘瞭解一下HotSpot使用的版本管理工具,能夠簡單理解爲GIThtml
基本命令:
add add the specified files on the next commit
annotate show changeset information by line for each file
clone make a copy of an existing repository
commit commit the specified files or all outstanding changes
diff diff repository (or selected files)
export dump the header and diffs for one or more changesets
forget forget the specified files on the next commit
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge another revision into working directory
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
serve start stand-alone webserver
status show changed files in the working directory
summary summarize working directory state
update update working directory (or switch revisions)
下載HotSpot源碼
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/
HotSpot源碼分析
cpu:
os:
os_cpu:
share:
tools:
vm:
gc_implementation:
concurrentMarkSweep:
g1:
parallelScavenge:
parNew:
shared:
OOP-Klass模型
- OOP Ordinary Object Pointer
- Klass 由於class在C++中是關鍵字,因此叫Klass
內存佔用
回收
分代
年輕代
老年代
永久代
永久代並非永久存在的,這麼叫是歷史緣由。
收集器
低延時
高吞吐
- Maximum pause time goal
- Throughput goal
- Minimum footprint goal
除非有停頓問題,不然因儘可能知足內存。默認大小一般設置特別小。java
- server
- client
分代參數web
參數 |
描述 |
默認值 |
-XX:MinHeapFreeRatio |
堆內存初始空閒比例 |
|
-XX:MaxHeapFreeRatio |
堆內存最大空閒比例 |
|
-Xms |
堆內存初始值 |
物理內存1/64 |
-Xmx |
堆內存最大值 |
物理內存1/4 |
-Xmn |
年輕代大小 |
|
-XX:NewSize |
年輕代初始值 |
|
-XX:MaxNewSize |
年輕代最大值 |
|
-XX:NewRatio |
年輕代/老年代比例 |
|
-XX:SurvivorRatio |
Eden區/Survivor區比例 |
|
-XX:PermSize |
持久代初始值 |
|
-XX:MaxPermSize |
持久代最大值 |
|
GC選擇算法
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:-UseParallelOldGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
GC參數shell
-XX:MaxGCPauseMillis=<N>
-XX:GCTimeRatio=<N> 垃圾回收時間/程序運行時間
-Xmx<N
Excessive GC Time and OutOfMemoryError 過分GC形成OOM服務器
-XX:-UseGCOverheadLimit
-
JVM調優參數
- XX:MaxTenuringThreshold 垃圾最大存活年齡,年齡指複製算法一次或標記等
- XX:TargetsurvivorRatio
- Xss 線程所佔堆棧大小-XX:ThreadStackSize
新生代垃圾收集器
- 單線程
- 適合客戶端應用
- 簡單高效
- 採用「複製算法」
- 多線程並行
- 多CPU服務器環境,單CPU環境不如Serial
- 追求「下降停頓時間」
- 採用「複製算法」
- 多線程版本的Serial,目的是縮短GC時間,減小用戶停頓時間
- 多線程並行
- 採用「複製算法」
- 對比ParNew收集器,ParNew追求下降用戶線程的停頓時間,適合交互式應用;而Paraller Scavenge追求CPU吞吐量,適合沒有交互的後臺應用
- Parallel Scavenge提供的參數
- 設置「吞吐量」
經過參數-XX:GCTimeRadio設置垃圾回收時間佔總CPU時間的百分比。
- 設置「停頓時間」
經過參數-XX:MaxGCPauseMillis設置垃圾處理過程最久停頓時間。Parallel Scavenge會根據這個值的大小肯定新生代的大小。若是這個值越小,新生代就會越小,從而收集器就能以較短的時間進行一次回收。但新生代變小後,回收的頻率就會提升,所以要合理控制這個值。
- 啓用自適應調節策略
經過命令-XX:+UseAdaptiveSizePolicy就能開啓自適應策略。咱們只要設置好堆的大小和MaxGCPauseMillis或GCTimeRadio,收集器會自動調整新生代的大小、Eden和Survior的比例、對象進入老年代的年齡,以最大程度上接近咱們設置的MaxGCPauseMillis或GCTimeRadio。
老年代垃圾收集器
- Serial收集器的老年代版本
- 標記-整理算法
- Parallel Scavenge的老年代版本
- CMS收集器是一款追求停頓時間的老年代收集器,它在垃圾收集時使得用戶線程和GC線程並行執行,所以在垃圾收集過程當中用戶也不會感覺到明顯的卡頓。但用戶線程和GC線程之間不停地切換會有額外的開銷,所以垃圾回收總時間就會被延長。
- 垃圾回收過程
- 初始標記
中止一切用戶線程,僅使用一條初始標記線程對全部與GC ROOTS直接關聯的對象進行標記。速度很快。
- 併發標記
使用多條併發標記線程並行執行,並與用戶線程併發執行。此過程進行可達性分析,標記出全部廢棄的對象。速度很慢。
- 從新標記
中止一切用戶線程,並使用多條從新標記線程並行執行,將剛纔併發標記過程當中新出現的廢棄對象標記出來。這個過程的運行時間介於初始標記和併發標記之間。
- 併發清除
只使用一條併發清除線程,和用戶線程們併發執行,清除剛纔標記的對象。這個過程很是耗時。
- CMS的缺點
- 吞吐量低
因爲CMS在垃圾收集過程使用用戶線程和GC線程並行執行,從而線程切換會有額外開銷,所以CPU吞吐量就不如在垃圾收集過程當中中止一切用戶線程的方式來的高。
- 沒法處理浮動垃圾,致使頻繁Full GC
因爲垃圾清除過程當中,用戶線程和GC線程併發執行,也就是用戶線程仍在執行,那麼在執行過程當中會產生垃圾,這些垃圾稱爲「浮動垃圾」。
若是CMS在垃圾清理過程當中,用戶線程須要在老年代中分配內存時發現空間不足時,就須要再次發起Full GC,而此時CMS正在進行清除工做,所以此時只能由Serial Old臨時對老年代進行一次Full GC。
- 使用「標記-清除」算法產生碎片空間
因爲CMS使用了「標記-清除」算法, 所以清除以後會產生大量的碎片空間,不利於空間利用率。
-不過CMS提供了應對策略:
開啓-XX:+UseCMSCompactAtFullCollection
開啓該參數後,每次FullGC完成後都會進行一次內存壓縮整理,將零散在各處的對象整理到一起。但每次都整理效率不高,所以提供瞭如下參數。
設置參數-XX:CMSFullGCsBeforeCompaction
本參數告訴CMS,通過了N次Full GC事後再進行一次內存整理。
通用垃圾收集器——G1垃圾收集器
- 追求停頓時間
- 多線程GC
- 面向服務端應用
- 標記-整理和複製算法合併
- 不會產生碎片內存。
- 可對整個堆進行垃圾回收
- 可預測停頓時間
-
G1的內存模型
- Region G1垃圾收集器沒有新生代和老年代的概念了,而是將堆劃分爲一塊塊獨立的Region。當要進行垃圾收集時,首先估計每一個Region中的垃圾數量,每次都從垃圾回收價值最大的Region開始回收,所以能夠得到最大的回收效率。
- Remembered Set
個對象和它內部所引用的對象可能不在同一個Region中,那麼當垃圾回收時,是否須要掃描整個堆內存才能完整地進行一次可達性分析? 固然不是,每一個Region都有一個Remembered Set,用於記錄本區域中全部對象引用的對象所在的區域,從而在進行可達性分析時,只要在GC ROOTs中再加上Remembered Set便可防止對全部堆內存的遍歷。
-
G1垃圾收集過程
- 初始標記 標記與GC ROOTS直接關聯的對象,中止全部用戶線程,只啓動一條初始標記線程,這個過程很快。
- 併發標記 進行全面的可達性分析,開啓一條併發標記線程與用戶線程並行執行。這個過程比較長。
- 最終標記 標記出併發標記過程當中用戶線程新產生的垃圾。中止全部用戶線程,並使用多條最終標記線程並行執行。
- 篩選回收 回收廢棄的對象。此時也須要中止一切用戶線程,並使用多條篩選回收線程並行執行。
延伸閱讀