自己建网站要多少钱,什么是电子商务网站,两个网站 一个域名,自己做网站用花钱吗一、垃圾回收的基本步骤 标记#xff08;Marking#xff09; 从GC Roots#xff08;如虚拟机栈、方法区静态变量、本地方法栈等#xff09;出发#xff0c;遍历对象引用链#xff0c;标记所有可达对象为存活对象#xff0c;未被标记的则视为垃圾。此阶段需暂停用户线程Marking 从GC Roots如虚拟机栈、方法区静态变量、本地方法栈等出发遍历对象引用链标记所有可达对象为存活对象未被标记的则视为垃圾。此阶段需暂停用户线程Stop-The-World, STW不同回收器优化策略不同例如CMS和G1通过并发标记减少停顿。 清除Sweeping 根据标记结果清理垃圾对象具体实现方式因算法而异
标记-清除Mark-Sweep 直接回收未标记对象但会产生内存碎片。标记-整理Mark-Compact 移动存活对象以消除碎片适合老年代。复制Copying 将存活对象复制到另一块内存区域适合新生代如Survivor区。
压缩Compacting可选 部分回收器如Serial Old在清除后整理内存提升连续空间利用率。 二、垃圾回收器的分类
根据工作模式、线程数、内存区间等维度垃圾回收器可分为以下类型
1. 按线程数划分 串行回收器Serial GC 特点单线程执行垃圾回收全程STW。适用场景客户端程序或小内存应用如嵌入式系统。代表Serial新生代、Serial Old老年代。 并行回收器Parallel GC 特点多线程并行回收提高吞吐量但STW时间仍较长。适用场景注重吞吐量、多核CPU的服务器应用。代表ParNew新生代、Parallel Scavenge新生代、Parallel Old老年代。 并发回收器Concurrent GC 特点用户线程与GC线程交替工作减少STW时间。适用场景低延迟要求的应用如实时系统。代表CMSConcurrent Mark Sweep、G1Garbage-First、ZGC。
2. 按分代划分 新生代回收器 使用复制算法如Serial、ParNew、Parallel Scavenge。新生代分为Eden、Survivor区对象存活时间短回收频率高。 老年代回收器 使用标记-整理或标记-清除算法如CMS、Serial Old、Parallel Old。老年代对象存活时间长回收频率低但耗时长。 三、主流垃圾回收器详解
1. Serial/Serial Old
特点单线程、STW、简单高效适合小堆内存。缺点暂停时间长不适用于服务端。
2. ParNew
特点Serial的多线程版本与CMS配合使用。缺点在单核或低并发环境中可能不如Serial高效。
3. Parallel Scavenge/Parallel Old
特点以吞吐量为优先目标适合后台计算型应用。参数可通过-XX:MaxGCPauseMillis和-XX:GCTimeRatio调整停顿时间和吞吐量。
4. CMSConcurrent Mark Sweep
特点并发标记、低延迟但会产生内存碎片。阶段初始标记STW→ 并发标记 → 重新标记STW→ 并发清除。问题JDK 14后已废弃因碎片化和无法处理大堆。
5. G1Garbage-First
特点 将堆划分为多个Region优先回收垃圾最多的区域。支持并发标记、混合回收同时处理新生代和老年代且通过压缩减少碎片。 适用场景大堆内存如几十GB和低延迟要求默认从JDK 9开始。
6. ZGC
特点 支持TB级堆内存STW时间不超过10ms基于指针染色和读屏障实现并发。适用于高吞吐量、低延迟的云原生应用。 四、选择与调优建议 版本差异 JDK 8默认Parallel Scavenge Parallel Old。JDK 9默认G1。JDK 11可选ZGC实验性功能。 调优参数示例 启用G1-XX:UseG1GC。设置堆大小-Xms4g -Xmx4g固定堆避免动态调整。日志分析-Xlog:gc*JDK 9或-XX:PrintGCDetailsJDK 8。 场景推荐 高吞吐量Parallel Scavenge/Old。低延迟G1或ZGC。小内存Serial。 五、垃圾回收的本质与哲学矛盾
垃圾回收的核心矛盾在于时空效率的平衡时间维度上要减少STWStop-The-World停顿时间空间维度上要高效利用内存且避免碎片。这一矛盾驱动了GC算法的迭代。 底层逻辑框架
对象存活判定通过可达性分析构建对象图Object Graph以GC Roots为起点进行DFS/BFS遍历三色标记法的数学抽象内存拓扑管理分代假设弱代假说将内存划分为不同区域通过空间换时间策略优化回收效率并发控制写屏障Write Barrier技术解决并发标记阶段的对象消失问题具体实现有增量更新CMS和原始快照G1两种流派 一、算法演化与硬件协同
1. 分代算法的物理本质
新生代采用复制算法Copying本质是顺序写批量删除利用空间局部性原理提升缓存命中率老年代标记-整理Mark-Compact通过内存重映射解决碎片但需要处理指针更新问题G1的Remembered Set
2. 并发回收的硬件级优化
现代GC如ZGC利用地址视图转换实现并发压缩关键技术包括
指针染色Colored Pointer在64位指针中嵌入元数据内存多重映射mmap同一物理内存映射到多个虚拟地址空间 四、主流回收器架构对比
回收器内存模型并发策略碎片处理适用场景CMS传统分代并发标记并行清除不处理标记清除老年代低延迟G1Region分区增量标记并行复制局部整理大堆平衡型ZGC无分代全并发染色指针无碎片超大堆TB级低延迟ShenandoahRegion分区并发复制读屏障无碎片中等堆高吞吐量
设计哲学差异
CMS时间优先通过并发降低停顿容忍内存碎片G1空间可预测建立Region回收价值模型ZGC硬件驱动利用64位地址空间特性突破传统限制
五、关键扩展
1. 三色标记的工程实现
漏标问题的两种解决方案 增量更新CMS 记录新增引用类似数据库redo log原始快照G1 记录删除引用类似MVCC快照
// 写屏障伪代码示例G1风格
void oop_field_store(oop* field, oop new_value) {pre_write_barrier(field); // 记录旧值*field new_value; post_write_barbarrier(field, new_value); // 记录新值
}2. 停顿时间控制机制
G1的预测模型基于Markov链建立Region回收价值预测ZGC的Phase机制将GC过程分解为10个可中断的phase
3. 内存分配与GC联动
TLABThread Local Allocation Buffer 每个线程独享的分配缓冲区避免全局锁竞争Humongous ObjectG1对超大对象的特殊处理直接放入老年代Region 五、总结
JVM垃圾回收器的演进体现了对性能、延迟和内存管理的持续优化。从早期的单线程Serial到并发的G1、ZGC开发者需根据应用场景如堆大小、延迟要求、JDK版本选择合适的回收器并通过参数调优实现最佳性能。