分類 | 垃圾回收器類型 |
---|---|
線程數 | 串行垃圾回收 |
並行垃圾回收 | |
工做模式 | 併發垃圾回收 |
獨佔垃圾回收 | |
碎片算法 | 壓縮垃圾回收 |
非壓縮垃圾回收 | |
分代 | 新生代垃圾回收 |
老年代垃圾回收 |
指在應用程序的生命週期內,應用程序所花費的時間和系統總運行時間的比值
系統總運行時間=程序耗時+GC耗時
若是系統運行了100min,gc運行了1min,那麼系統的吞吐量就是(100-1)/100=99%算法
和吞吐量想法,垃圾負載是指回收器耗時與系統運行總時間的比值服務器
指垃圾回收器正在運行時,應用程序的暫停時間。對於獨立回收器而言,停頓時間可能會比較長。多線程
回收頻率指回收器多長時間會運行一次。通常來講,固定程序的頻率越低越好。併發
當一個對象稱爲垃圾對象以後,多長時間,它佔據的內存會被釋放性能
一般狀況下,很難讓一個程序在全部指標上都達到最優,只能根據程序特色,儘量讓GC配合程序而工做spa
Serial收集器 是最古老,實現簡單,邏輯高效,JVM默認的一款收集器.net
- | - |
---|---|
線程數 | 串行單線程 |
工做模式 | 獨佔式 |
分代 | 新生代,老年代 |
碎片處理 | 新生代: 複製算法. 老年代:標記壓縮算法 |
GC 參數 | -XX:+UseSerialGC |
串行的工做模式會致使較長的應用程序的停頓時間 線程
ParNew收集器是針對新生代並行的收集器。設計
- | - |
---|---|
線程數 | 並行多線程 |
工做模式 | 獨佔式 |
分代 | 新生代 |
碎片處理 | 複製算法 |
GC 參數 | -XX:UseParNewGC |
並行的工做模型是指 GC的線程在同一時刻同時運行,和應用程序仍是串行的模式,因此也仍是會和應用程序去爭奪CPU資源,當GC分配到資源後 會形成短暫的程序停頓,可是同時也會下降吞吐量 code
Paralle Scavenge 收集器 和 ParNew 收集器相似。區別在於Paralle Scavenge 收集器
重點關注 程序吞吐量。有時,這個收集器也被叫爲吞吐量優先 收集器
- | - |
---|---|
線程數 | 並行多線程 |
工做模式 | 獨佔式 |
分代 | 新生代 |
碎片處理 | 複製算法 |
GC 參數 | -XX:UseParallelGC -XX:MaxGCPauseMillis 設置最大停頓時間 -XX:GCTimeRatio 設置吞吐量 默認是99 GC時間=1/(1+99)=1% |
Serial Old收集器是 Serial 收集器老版本 針對 老年代使用。已被Serial收集器取代。
多樹 是和Parallel Scavenge 組合使用
- | - |
---|---|
線程數 | 串行單線程 |
工做模式 | 獨佔式 |
分代 | 老年代 |
碎片處理 | 標記壓縮 |
GC 參數 | -XX:UseSerialOldGC |
Paraell Old 收集器是針對老年代並行的收集器。
- | - |
---|---|
線程數 | 並行多線程 |
工做模式 | 非獨佔式 |
分代 | 老年代 |
碎片處理 | 標記清理 |
GC 參數 | -XX:UseParallelOldGC -XX:ParallelGCThreads 並行線程的數量 |
Concurrent Mark Sweep
CMS 是一個單純的老年收集器 採用Mark-Sweep算法,主要關注與停頓時間。它採用非獨佔式的併發模式,能夠和應用程序同時執行,因此總的來講 停頓時間較少
運行過程比較複雜,在標記,清除的不一樣階段,它會嘗試與應用程序同時進行。
–初始標記
•根能夠直接關聯到的對象
•速度快
–併發標記(和用戶線程一塊兒)
•主要標記過程,標記所有對象
–從新標記
•因爲併發標記時,用戶線程依然運行,所以在正式清理前,再作修正
–併發清除(和用戶線程一塊兒)
•基於標記結果,直接清理對象
- | - |
---|---|
線程數 | 並行多線程 |
工做模式 | 獨佔式 |
分代 | 老年代 |
碎片處理 | 標記壓縮 |
GC 參數 | –-XX:+UseConcMarkSweepGC |
G1 (Garbage-First)是一款面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器. 以極高機率知足GC停頓時間要求的同時,還具有高吞吐量性能特徵. 在Oracle JDK 7 update 4 及以上版本中獲得徹底支持, 專爲如下應用程序設計:
G1 的長期目標是取代CMS(Concurrent Mark-Sweep Collector, 併發標記-清除). 由於特性的不一樣使G1成爲比CMS更好的解決方案. 一個區別是,G1是一款壓縮型的收集器.G1經過有效的壓縮徹底避免了對細微空閒內存空間的分配,不用依賴於regions,這不只大大簡化了收集器,而 且還消除了潛在的內存碎片問題。除壓縮之外,G1的垃圾收集停頓也比CMS容易估計,也容許用戶自定義所但願的停頓參數(pause targets)
上一代的垃圾收集器(串行serial, 並行parallel, 以及CMS)都把堆內存劃分爲固定大小的三個部分: 年輕代(young generation), 年老代(old generation), 以及持久代(permanent generation).
而 G1 收集器採用一種不一樣的方式來管理堆內存.
堆內存被劃分爲多個大小相等的 heap 區,每一個heap區都是邏輯上連續的一段內存(virtual memory). 其中一部分區域被當成老一代收集器相同的角色(eden, survivor, old), 但每一個角色的區域個數都不是固定的。這在內存使用上提供了更多的靈活性
超連接: G1 收集器 詳解
-XX:+UseSerialGC:在新生代和老年代使用串行收集器 -XX:SurvivorRatio:設置eden區大小和survivior區大小的比例 -XX: NewRatio:新生代和老年代的比 -XX:+UseParNewGC:在新生代使用並行收集器 -XX:+UseParallelGC :新生代使用並行回收收集器 -XX:+UseParallelOldGC:老年代使用並行回收收集器 -XX:ParallelGCThreads:設置用於垃圾回收的線程數 -XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器 -XX:ParallelCMSThreads:設定CMS的線程數量 -XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少後觸發 -XX:+UseCMSCompactAtFullCollection:設置CMS收集器在完成垃圾收集後是否要進行一次內存碎片的整理 -XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次內存壓縮 -XX:+CMSClassUnloadingEnabled:容許對類元數據進行回收 -XX:CMSInitiatingPermOccupancyFraction:當永久區佔用率達到這一百分比時,啓動CMS回收 -XX:UseCMSInitiatingOccupancyOnly:表示只在到達閥值的時候,才進行CMS回收