
1. 垃圾回收器
1.1. 物件可以在被需要時創建,不再使用時由JVM自動回收
1.2. GC是查找不再使用的物件,然后回收這些物件相關記憶體的程序
1.2.1. 找到不使用的物件、回收其記憶體、壓縮堆記憶體
1.3. 優化垃圾回收器比跟蹤指標引起的bug要容易得多(且耗時更少)
1.4. VM必須定期搜索堆中不使用的物件
1.4.1. 從GC根(GC root)物件開始搜索,GC根是可以從堆外被訪問的物件,主要包括執行緒堆疊和系統類
1.4.2. 當GC演算法找到不使用的物件時,JVM會回收這些物件占用的記憶體,并將這些記憶體分配給其他物件
2. 垃圾回收器運行多個執行緒
2.1. 一組執行應用程式邏輯,通常被稱為mutator執行緒
2.1.1. 作為應用程式邏輯的一部分會改變物件
2.2. 另一組執行GC,當GC執行緒跟蹤物件參考(用于回收物件)或者在記憶體中移動物件時,它們必須確保應用程式執行緒不使用這些物件
2.3. 所有執行緒都停止運行的停頓被稱為STW停頓(stop-the-world pause)
2.3.1. 盡量減少這些停頓是優化GC的重中之重
3. 垃圾回收器分代
3.1. 分代理由
3.1.1. 大量物件(有時甚至是大多數物件)是臨時物件
3.1.2. 很多物件的使用時間很短
3.2. 老年代
3.2.1. old generation或tenured generation
3.2.2. Full GC
3.2.2.1. 一般會造成應用程式執行緒較長時間的停頓
3.3. 新生代
3.3.1. young generation
3.3.2. 只是整個堆的一部分
3.3.2.1. 物件首先在新生代中分配
3.3.2.2. 比處理整個堆要快
3.3.3. Eden空間
3.3.3.1. 占據了新生代的絕大多數空間
3.3.3.2. 最初物件會被分配到Eden空間
3.3.3.3. 不再使用的物件被丟棄
3.3.3.4. 仍在使用的物件被移動到一個Survivor空間或者晉升到老年代
3.3.4. Survivor空間
3.3.4.1. 在回收結束時,Eden空間和一個Survivor空間被清空,新生代中剩余的物件都被壓縮到另一個Survivor空間中
3.3.5. Minor GC
3.3.5.1. Young GC
3.3.5.2. 當新生代被填滿時,垃圾回收器會停止所有的應用程式執行緒,并清空新生代
3.3.5.3. 不再使用的物件被丟棄
3.3.5.4. 仍在使用的物件被移到其他地方
4. 并發回收器
4.1. concurrent collector
4.2. 低停頓(low-pause)回收器
4.3. 無停頓(pauseless)回收器
4.4. 查找的代碼可以在不停止應用程式執行緒的情況下運行
4.5. 代價是應用程式總體上使用更多的CPU時間
4.5.1. 避免長時間停頓是以消耗額外的CPU周期為代價的
4.6. 更難優化以達到最佳性能
5. 選型
5.1. 單個請求會受停頓時間的影響,尤其是Full GC時較長時間的停頓
5.1.1. 減少停頓對回應時間的影響,那么并發回收器可能更合適
5.2. 如果平均回應時間比例外值(例如第90百分位回應時間)更重要
5.2.1. 并發回收器可能會產生更好的結果
6. GC演算法
6.1. Serial垃圾回收器
6.1.1. 最簡單的回收器
6.1.2. 在只有一個CPU可用且額外的GC執行緒會干擾應用程式的情況下使用(而且是默認的)
6.1.2.1. 只有一個核心(甚至是以兩個CPU形式出現的超執行緒核心)的虛擬機和Docker容器讓這個演算法又有了使用的意義
6.1.3. 使用單執行緒來處理堆
6.1.3.1. 處理堆時會停止所有的應用程式執行緒(不管是Minor GC還是Full GC)
6.1.3.2. 在Full GC期間,它將完全壓縮老年代
6.1.4. -XX:+UseSerialGC標志可以開啟
6.1.5. -XX:-UseSerialGC并不會禁用
6.1.5.1. 禁用需要設定另外一個垃圾回收器
6.2. CMS垃圾回收器
6.2.1. 第一個并發垃圾回收器
6.2.1.1. JDK 8中相當流行
6.2.1.2. 自JDK 11被正式廢棄,而且不鼓勵在JDK 8中使用
6.2.2. 會在Minor GC的程序中停止所有的應用程式執行緒
6.2.3. 主要缺陷是它不能在后臺處理程序中壓縮堆
6.2.4. -XX:+UseConcMarkSweepGC標志開啟
6.2.4.1. 默認值是false
6.3. Throughput垃圾回收器
6.3.1. 并行回收器(parallel collector)
6.3.2. JDK8中任何有兩個或者多個CPU的64位機器的默認垃圾回收器
6.3.3. -XX:+UseParallelGC標志
6.3.4. -XX:+UseParallelOldGC標志
6.3.4.1. 已經過時了
6.3.4.2. 可以禁用這個標志,只對新生代進行并行回收
6.4. G1 GC
6.4.1. 垃圾優先垃圾回收器
6.4.2. 使用并發回收策略來以最小的停頓回收堆
6.4.3. JDK 11和之后版本的默認垃圾回收器
6.4.4. -XX:+UseG1GC標志開啟
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546596.html
標籤:Java
上一篇:Python 中連接MSSQL,MySQL,SQLite,Redis,ElasticSearch,Mongodb,PostgreSQL,Oracle,RabbitMQ
下一篇:大檔案斷點續傳如何實作?
