当前位置: 首页 > news >正文

垃圾回收算法与垃圾收集器

文章目录

  • 一、垃圾回收算法
    • 1. 标记-清除算法
    • 2. 复制算法
    • 3. 标记-整理算法
  • 二、垃圾收集器
    • 新生代收集器
      • 1. Serial收集器
      • 2. ParNew收集器
      • 3. Parallel Scavenge收集器
    • 老年代收集器
      • 1. Serial Old收集器
      • 2. Parallel Old收集器
      • 3. CMS收集器
    • G1收集器
      • 概念特点
      • G1的工作流程
      • G1的优势
  • 三、算法与收集器的对应关系

一、垃圾回收算法

1. 标记-清除算法

工作流程:

第一阶段:标记出所有需要回收的对象
第二阶段:清除统一回收所有被标记的对象

优缺点:

  • 优点:实现简单,适用于存活对象多的场景
  • 缺点:会产生内存碎片,效率不稳定

2. 复制算法

工作流程:

将内存分为两块相等区域
只使用其中一块,另一块闲置
GC时将存活对象复制到闲置区域
清空原使用区域,两块区域角色互换

优缺点:

  • 优点:无内存碎片,效率高
  • 缺点:浪费一半内存空间,以空间换时间

3. 标记-整理算法

工作流程:

第一阶段:标记所有存活对象
第二阶段:将存活对象向内存一端移动
第三阶段:清理掉边界以外的内存

优缺点:

  • 优点:无内存碎片,内存利用率高
  • 缺点:移动对象成本高,效率较低

二、垃圾收集器

新生代收集器

1. Serial收集器

特点:

  1. GC时会暂停所有用户线程(Stop The World)
  2. 单线程执行垃圾回收
  3. 回收完成后恢复用户线程

2. ParNew收集器

特点:

  1. 多线程并行收集
  2. 其他行为与Serial完全一样
  3. 常与CMS搭配使用

3. Parallel Scavenge收集器

特点:

  1. 可控制的吞吐量(运行代码时间/(运行代码时间+GC时间))
  2. 自适应调节策略
  3. 目标是达到可控的吞吐量

老年代收集器

1. Serial Old收集器

这是Serial收集器的老年代版本:

还是单线程工作
使用标记-整理算法
主要用在客户端程序上

2. Parallel Old收集器

这是Parallel Scavenge的搭档:

多线程并行工作
同样使用标记-整理算法
和Parallel Scavenge一起使用,整体注重吞吐量

3. CMS收集器

CMS全称是Concurrent Mark Sweep,意思是并发标记清除,这是个很有特色的收集器:
工作流程比较复杂:

初始标记:快速标记一下根源对象,这个过程需要暂停程序
并发标记:一边让程序正常跑,一边慢慢标记所有要清理的对象
重新标记:再暂停一下程序,修正错标、漏标的对象
并发清除:一边让程序跑,一边清理垃圾

CMS的缺点:

  1. 在并发标记阶段会和用户线程争抢CPU资源,影响用户线程的执行效率
  2. 清理过程中还在产生新垃圾(浮动垃圾),有些垃圾这次清理不了,得放到下一次GC
  3. 使用标记-清除算法,会产生内存碎片

G1收集器

概念特点

G1是Garbage First的缩写,这是目前比较先进的收集器:

  1. 把整个内存分成很多小块(Region),每块通常1-32MB
  2. 每个小块可以分别当作新生代或老年代来用
  3. 每次清理的时候,会根据垃圾最多、回收效益最高的的几个小块来清理

G1的工作流程

初始标记:快速标记根源对象,需要暂停程序
并发标记:程序正常跑的同时进行标记工作
最终标记:暂停程序,处理并发期间的变化
筛选回收:暂停程序,选择最值得清理的区域进行回收

G1的优势

  1. 可以设定目标暂停时间,比如希望每次暂停不超过200毫秒
  2. 内存利用率高,没有传统分代收集器的空间浪费
  3. GC时不会产生内存碎片
  4. 适合大内存应用,可以处理几个G到几十G的堆内存

三、算法与收集器的对应关系

收集器算法选择适用场景
Serial复制(新生代)单核CPU,小应用
ParNew复制(新生代)多核CPU,配合CMS
Parallel Scavenge复制(新生代)注重吞吐量
Serial Old标记-整理(老年代)单核CPU,小应用
Parallel Old标记-整理(老年代)注重吞吐量
CMS标记-清除(老年代)注重响应时间
G1复制+标记-整理大堆内存,低延迟要求
http://www.lryc.cn/news/600440.html

相关文章:

  • cacti的命令执行和回显
  • JVM参数
  • 学习游戏制作记录(剑投掷技能)7.26
  • Flutter开发实战之原生平台集成
  • 暑期算法训练.9
  • 如何查找php配置文件php.ini
  • ICMPv6报文类型详解表
  • 面条式代码(Spaghetti Code)
  • 编程与数学 03-002 计算机网络 06_网络层职责
  • RK3568笔记九十三:基于RKNN Lite的YOLOv5目标检测
  • 【Spring AI】SiliconFlow-硅基流动
  • MySQL操作进阶
  • 备份一下我的 mac mini 的环境变量配置情况
  • Android Studio Profiler工具使用流程
  • MyBatis_3
  • 零基础学后端-PHP语言(第二期-PHP基础语法)(通过php内置服务器运行php文件)
  • 【安全漏洞】防范未然:如何有效关闭不必要的HTTP请求方法,保护你的Web应用
  • Java中List集合对象去重及按属性去重
  • linux内核电源管理
  • Java同步锁性能优化:15个高效实践与深度解析
  • [spring6: Mvc-函数式编程]-源码解析
  • 栈----2.最小栈
  • 【VLLM】open-webui部署模型全流程
  • JavaWeb(苍穹外卖)--学习笔记11(Filter(过滤器) 和 Interceptor(拦截器))
  • JavaScript中.splice()的用法
  • 从压缩到加水印,如何实现一站式图片处理
  • 动态SQL标签
  • 【动态规划-斐波那契数列模型】理解动态规划:斐波那契数列的递推模型
  • 【深度之眼机器学习笔记】04-01-决策树简介、熵,04-02-条件熵及计算举例,04-03-信息增益、ID3算法
  • 深分页性能问题分析与优化实践