java 垃圾收集器

java 垃圾收集算法分为 标记-复制,标记-清除,标记-整理三种算法。

java 垃圾收集器共分为 series收集器,parallel收集器,parNew收集器,CMS收集器,G1收集器。

其中 series收集器是单线程的收集器,他在做GC的时候,会STW(stop the world)

parallel收集器,和series的垃圾收集算法类似,只是parallel可以采用多线程进行垃圾收集,但是同样在做垃圾收集的时候也会STW 。

CMS在做GC的时候,在初始标记的时候回STW,不过是很短暂的时间,在并发标记的时候,是可以和用户的应用线程同时工作的,整个GC的过程会比series和parallel的GC过程长,但是用户基本感知不到STW的过程,在并发标记的过程中用到的三色标记算法,三色标记算法值,把内存中的对象用三种颜色来进行区分,对象中所有元素都已经标记过的用黑色来表示,被黑色的对象所应用的用灰色来表示,没有被标记的用白色来标记,在并发标记的过程中防止漏标,底层分别采用的 写前屏障+增量更新

增量更新,也是在赋值操作之前把对应的关系放在一个队列之中,队列主要是用来异步解耦的,在重新标记的过程中,用队列里面的存储的应用关系来找到其所对应的GC Root,并把GC Root由黑置灰再次标记,次动作实在重新标记的过程中进行的,初始标记和重新标记都会STW,所以队列之中的关系不会再发生改变。

### Java 垃圾收集器种类及工作原理详解 Java垃圾收集器(Garbage Collector, GC)是 JVM 自动管理内存的核心机制,其目标是自动识别并回收不再使用的对象,从而释放内存资源。不同的垃圾收集器适用于不同的应用场景,主要依据程序对吞吐量、延迟和内存占用的要求进行选择。 #### 1. **Serial 收集器** Serial 是最基本的单线程垃圾收集器,适用于客户端模式下的小型应用。它在进行垃圾回收时会暂停所有用户线程(Stop-The-World),直到回收完成。尽管性能较低,但它的简单性和低开销使其在单核 CPU 或小内存环境中仍然适用。 该收集器采用**标记-复制算法**来清理新生代内存[^3]。 #### 2. **Parallel Scavenge 收集器** Parallel Scavenge 是多线程版本的 Serial 收集器,专注于提高应用程序的**吞吐量**。它同样使用**标记-复制算法**处理新生代,适合用于后台计算密集型任务。 通过设置 `-XX:+UseParallelGC` 启用,并可通过 `-XX:GCTimeRatio` 控制吞吐量与 GC 时间的比例[^4]。 #### 3. **CMS(Concurrent Mark Sweep)收集器** CMS 是一种以低延迟为目标的老年代收集器,采用**标记-清除算法**。它分为四个阶段:初始标记、并发标记、重新标记和并发清除。其中,只有初始标记和重新标记阶段需要 Stop-The-World,其余阶段可以与用户线程并发执行。 CMS 在 JDK 9 中被标记为废弃,但仍广泛用于 JDK 8 及更早版本中。启用参数为 `-XX:+UseConcMarkSweepGC`,并可设置触发阈值如 `-XX:CMSInitiatingOccupancyFraction=75`[^4]。 #### 4. **G1(Garbage First)收集器** G1 是目前主流的垃圾收集器之一,适用于大堆内存和多核 CPU 环境。它将整个堆划分为多个大小相等的 Region,物理上不连续,每个 Region 可属于 Eden、Survivor 或 Old 区域。 G1 使用**分区回收策略**,优先回收垃圾最多的 Region,从而控制停顿时间。其核心优势在于能够在高吞吐量的前提下提供较短的 GC 停顿时间。 从 JDK 9 开始成为默认收集器,可通过 `-XX:+UseG1GC` 显式启用,并通过 `-XX:MaxGCPauseMillis` 设置最大停顿时间目标[^2]。 #### 5. **ZGC(Z Garbage Collector)与 Shenandoah** ZGC 和 Shenandoah 是新一代超低延迟垃圾收集器,适用于需要亚毫秒级停顿时间的应用场景,例如金融交易系统或实时服务。 它们都采用**染色指针**和**并发整理算法**,在几乎不影响用户线程的情况下完成垃圾回收。ZGC 更加注重可伸缩性,支持 TB 级别的堆内存。 启用 ZGC 需要 JDK 11+,使用参数 `-XX:+UseZGC -Xmx16g` 等配置。 #### 6. **垃圾回收过程示例** 以下是一个典型的分代垃圾回收伪代码: ```java void generationalGC() { // 新生代GC youngGenGC(); // 如果对象在多次新生代GC后仍然存活,晋升到老年代 if (object.age > AGE_THRESHOLD) { promoteToOldGen(object); } // 老年代GC(频率较低) if (oldGen.isFull()) { oldGenGC(); } } ``` #### 7. **常见调优参数** 在实际部署中,合理的 JVM 参数配置对 GC 性能至关重要。例如: - G1 收集器常用参数组合: ```bash -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags ``` 输出信息包括 G1 的内部参数调整结果,如并发线程数、堆大小等[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值