內存管理機制-垃圾回收集器

 

RoadMap

 

垃圾回收器的類型

分類 垃圾回收器類型
線程數 串行垃圾回收
  並行垃圾回收
工做模式 併發垃圾回收
  獨佔垃圾回收
碎片算法 壓縮垃圾回收
  非壓縮垃圾回收
分代 新生代垃圾回收
  老年代垃圾回收

評價GC策略的指標

吞吐量

指在應用程序的生命週期內,應用程序所花費的時間和系統總運行時間的比值 
系統總運行時間=程序耗時+GC耗時 
若是系統運行了100min,gc運行了1min,那麼系統的吞吐量就是(100-1)/100=99%算法

回收負載

和吞吐量想法,垃圾負載是指回收器耗時與系統運行總時間的比值服務器

停頓時間

指垃圾回收器正在運行時,應用程序的暫停時間。對於獨立回收器而言,停頓時間可能會比較長。多線程

回收頻率

回收頻率指回收器多長時間會運行一次。通常來講,固定程序的頻率越低越好。併發

反應時間

當一個對象稱爲垃圾對象以後,多長時間,它佔據的內存會被釋放性能

一般狀況下,很難讓一個程序在全部指標上都達到最優,只能根據程序特色,儘量讓GC配合程序而工做spa

垃圾回收器

Serial 收集器

Serial收集器 是最古老,實現簡單,邏輯高效,JVM默認的一款收集器.net

- -
線程數 串行單線程
工做模式 獨佔式
分代 新生代,老年代
碎片處理 新生代: 複製算法. 老年代:標記壓縮算法
GC 參數 -XX:+UseSerialGC

串行的工做模式會致使較長的應用程序的停頓時間 線程

ParNew 收集器

ParNew收集器是針對新生代並行的收集器。設計

- -
線程數 並行多線程
工做模式 獨佔式
分代 新生代
碎片處理 複製算法
GC 參數 -XX:UseParNewGC

並行的工做模型是指 GC的線程在同一時刻同時運行,和應用程序仍是串行的模式,因此也仍是會和應用程序去爭奪CPU資源,當GC分配到資源後 會形成短暫的程序停頓,可是同時也會下降吞吐量 code

Parallel Scavenge 收集器

Paralle Scavenge 收集器 和 ParNew 收集器相似。區別在於Paralle Scavenge 收集器 
重點關注 程序吞吐量。有時,這個收集器也被叫爲吞吐量優先 收集器

- -
線程數 並行多線程
工做模式 獨佔式
分代 新生代
碎片處理 複製算法
GC 參數 -XX:UseParallelGC
-XX:MaxGCPauseMillis 設置最大停頓時間
-XX:GCTimeRatio 設置吞吐量 默認是99 GC時間=1/(1+99)=1%

Serial Old 收集器

Serial Old收集器是 Serial 收集器老版本 針對 老年代使用。已被Serial收集器取代。 
多樹 是和Parallel Scavenge 組合使用

- -
線程數 串行單線程
工做模式 獨佔式
分代 老年代
碎片處理 標記壓縮
GC 參數 -XX:UseSerialOldGC

Parallel old 收集器

Paraell Old 收集器是針對老年代並行的收集器。

- -
線程數 並行多線程
工做模式 非獨佔式
分代 老年代
碎片處理 標記清理
GC 參數 -XX:UseParallelOldGC 
-XX:ParallelGCThreads 並行線程的數量

CMS 收集器

Concurrent Mark Sweep 
CMS 是一個單純的老年收集器 採用Mark-Sweep算法,主要關注與停頓時間。它採用非獨佔式的併發模式,能夠和應用程序同時執行,因此總的來講 停頓時間較少 
運行過程比較複雜,在標記,清除的不一樣階段,它會嘗試與應用程序同時進行。

 
  1. –初始標記
  2. •根能夠直接關聯到的對象
  3. •速度快
  4. –併發標記(和用戶線程一塊兒)
  5. •主要標記過程,標記所有對象
  6. –從新標記
  7. •因爲併發標記時,用戶線程依然運行,所以在正式清理前,再作修正
  8. –併發清除(和用戶線程一塊兒)
  9. •基於標記結果,直接清理對象
- -
線程數 並行多線程
工做模式 獨佔式
分代 老年代
碎片處理 標記壓縮
GC 參數 –-XX:+UseConcMarkSweepGC

 

G1 收集器

G1 (Garbage-First)是一款面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器. 以極高機率知足GC停頓時間要求的同時,還具有高吞吐量性能特徵. 在Oracle JDK 7 update 4 及以上版本中獲得徹底支持, 專爲如下應用程序設計:

  • 能夠像CMS收集器同樣,GC操做與應用的線程一塊兒併發執行
  • 緊湊的空閒內存區間且沒有很長的GC停頓時間.
  • 須要可預測的GC暫停耗時.
  • 不想犧牲太多吞吐量性能.
  • 啓動後不須要請求更大的Java堆.

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 收集器 詳解

GC 參數整理

-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回收

相關文章
相關標籤/搜索