### 分代收集算法\(Generational Collection\)
分代搜集算法是針對對象的不同特性,而使用適合的算法
### 增量回收
在對實時性要求很高的程序中,比起縮短GC的平均中斷時間,往往更重視縮短GC的最大中斷時間。例如,在機器人的姿勢控制程序中,如果因為GC而讓控制程序中斷了0.1秒,機器人可能就摔倒了。或者,如果車輛制動控制程序因為GC而延遲響應的話,后果也是不堪設想的。在這些對實時性要求很高的程序中,必須能夠對GC所產生的中斷時間做出預測。例如,可以將“最多只能中斷10毫秒”作為附加條件。在一般的GC算法中,作出這樣的保證是不可能的,因為GC產生的中斷時間與對象的數量和狀態有關。
因此,為了維持程序的實時性,不等到GC全部完成,而是將GC操作細分成多個部分逐一執行。這種方式被稱為增量回收(Incremental GC)。在增量回收中,由于GC過程是漸進的,在回收過程中程序本身會繼續運行,對象之間的引用關系也可能會發生變化。如果已經完成掃描和標記的對象被修改,對新的對象產生了引用,這個新對象就不會被標記,明明是“存活”對象卻被回收掉了。在增量回收中為了避免這樣的問題,和分代回收一樣也采用了寫屏障。當已經被標記的對象的引用關系發生變化時,通過寫屏障會將新被引用的對象作為掃描的起始點記錄下來。由于增量回收的過程是分步漸進式的,可以將中斷時間控制在一定長度之內。另一方面,由于中斷操作需要消耗一定的時間,GC所消耗的總時間就會相應增加,正所謂有得必有失
### 并行回收
最近的計算機中,一塊芯片上搭載多個CPU核心的多核處理器已經逐漸普及。不僅是服務器,就連個人桌面電腦中,多核CPU也已經成了家常便飯。例如美國英特爾公司的Core i7就擁有6核12個線程。在這樣的環境中,就需要通過利用多線程來充分發揮多CPU的性能。并行回收正是通過最大限度利用多CPU的處理能力來進行GC操作的一種方式。并行回收的基本原理是,是在原有的程序運行的同時進行GC操作,這一點和增量回收是相似的。不過,相對于在一個CPU上進行GC任務分割的增量回收來說,并行回收可以利用多CPU的性能,盡可能讓這些GC任務并行(同時)進行。由于軟件運行和GC操作是同時進行的,因此就會遇到和增量回收相同的問題。為了解決這個問題,并行回收也需要用寫屏障來對當前的狀態信息保持更新。不過,讓GC操作完全并行,而一點都不影響原有程序的運行,是做不到的。因此在GC操作的某些特定階段,還是需要暫停原有程序的運行。在多核化快速發展的現在,并行回收也成了一個非常重要的話題,它的算法也在不斷進行改善。在硬件系統的支持下,無需中斷原有程序的完全并行回收器也已經呼之欲出。今后,這個領域相當值得期待
- 前言
- Write once, run anywhere
- 概述
- JAVA虛擬機
- JVM整體結構
- JVM架構模型
- JVM虛擬機分類
- HotSpot VM
- JRockit
- IBM-J9
- Azul/zing VM
- Taobao VM
- Dalvik VM
- Graal VM
- JAVA源碼編譯機制
- Javac編譯器
- 分析和輸入到符號表
- 注解處理
- 語義分析和生成class文件
- ECJ編譯器
- 類執行機制
- 字節碼解釋執行
- 棧頂緩存
- 部分棧幀共享
- 編譯執行
- 即時編譯器
- C1 Compiler
- C2 Compiler
- Graal編譯器
- C1與C2編譯器
- AOT
- 編譯優化
- 字符串優化
- 方法內聯
- 逃逸分析
- 同步消除
- 標量替換
- 棧上分配
- 去虛擬化/逆優化
- 多層編譯
- JVM編譯策略
- OSR編譯
- 冗余削除
- CodeCache
- 常量編譯優化
- JVM運行時數據區
- 程序計數器
- JAVA虛擬機棧
- 棧幀
- 局部變量表
- 操作數棧
- 本地方法棧
- Java調用native方法
- JVM Stacks && Native Stacks
- 堆-Heap
- 方法區(Method Area)
- 運行時常量池
- 常量傳播優化
- MetaSpace
- 直接內存
- StackOverflowError
- 遞歸方法
- OutOfMemoryError
- 本地內存溢出
- 執行引擎
- 運行時數據區關聯關系
- jdk8內存結構
- JMM內存模型
- JAVA內存模型
- JMM八種操作指令
- 內存屏障
- 指令重排
- as-if-serial語義
- Happen-Before規則
- 數據依賴性
- 原子性、可見性與有序性
- 偽共享
- CPU三級緩存
- 緩存行
- MESI協議
- Java中的偽共享
- ConcurrentHashMap偽共享解決方案
- 虛擬機對象
- 對象創建原理
- 對象內存布局
- 對象頭
- 實例數據
- 對象的訪問定位
- 垃圾收集器與內存分配策略
- GC相關概念
- TLAB
- JVM GC工作原理
- 內存管理
- JAVA引用分類
- 死亡標記
- 回收方法區
- 三色標記算法
- 垃圾收集算法
- 標記-清除算法
- 標記-整理算法
- 復制算法
- 分代收集算法
- HotSpot算法實現
- STW
- 垃圾收集器
- 常見的垃圾收集器
- 垃圾收集器分類
- Serial收集器
- Serial Old收集器
- ParNew收集器
- Parallel Scavenge收集器
- Parallel Old收集器
- CMS收集器
- CMS完整收集過程
- Card Table
- G1收集器
- 分代收集
- 空間整合
- 可預測的停頓時間模型
- G1&CMS
- 主要參數說明
- G1適用場景
- Remembered Set
- G1垃圾回收的過程
- G1優化建議
- Shenandoah
- ZGC
- 垃圾收集器特點
- GC日志
- GC策略的評價指標
- jvm card table數據結構
- 對象生存軌跡
- 類文件結構
- 魔數
- 版本號
- 常量池
- 訪問標志
- 父類索引
- 接口集合
- 字段集合
- 方法集合
- 屬性集合
- 類加載機制與類的初始化
- Java代碼執行流程
- 類加載過程
- 抽象類ClassLoader
- 常見類加載器
- BootstrapClassLoader
- 自定義類加載器
- 線程上下文類加載器
- 雙親委派模型
- Tomcat類加載機制
- ServiceLoader
- 類的初始化
- 常見的JVM類加載異常
- ClassNotFoundException
- NoClassDefFoundError
- LinkageError
- ClassCastException
- 虛擬機性能調優監控與故障處理工具
- CPU利用率高/飆升
- 排查及解決方案
- 上下文切換
- GC問題定位解決方案
- prommotion failed
- FullGC頻繁
- youngGC
- 內存問題
- 內存溢出和內存泄漏
- 內存溢出
- 棧溢出
- 堆溢出
- 對外內存溢出
- 內存泄漏
- 磁盤問題
- 線上問題解決方案
- 不定期出現的接口耗時現象
- 線程池異常
- 死鎖問題
- JVM調優
- jvm參考配置
- jvm-jstat
- jvm-jmap
- jvm-jstack
- jinfo
- jps
- 虛擬機的退出
- Shutdown Hook
- JVM指令
- 附錄
- 常用JVM指令
- Class文件版本號
- Class文件格式
- 方法訪問標識
- jvm常量池
- 類或接口的訪問標識
- 描述符標識字符含義
- 字段訪問標識
- Java程序與Docker容器環境
- 基準測試