JVM:不同垃圾收集算法和垃圾收集器 优缺点总结
如何判断对象是否为垃圾:
引用计数法:对象是否被引用,无法解决对象循环引用导致的问题
可达性分析:也叫根搜索法
垃圾收集算法
1、标记-清除(Mark-Sweep)
示意图
- 深蓝色:有对象引用
- 深灰色:没对象引用
- 白色:待分配空间
首先,标记出所有需要回收的对象;然后,清除掉所有被标记的对象
回收前:对整个引用空间不连续的堆对象遍历
回收后:引用的对象空间不变,清除:对全部垃圾对象遍历后清除
缺点:
耗时---整个堆的对象遍历
空间不连续,产生大量碎片空间---可能导致gc次数增多
2、复制算法(Copying):应用场景年轻代中s0,s1
示意图
将内存划分为两个等大小的区域,每次只使用其中一个区域。当该区域满时,将存活的对象复制到另一个区域,然后清空当前区域
回收前:空间复制,只用一份空间,对象引用空间不连续,生命周期短,朝生夕死,
回收后:会排列规整
优点:空间连续
缺点:浪费空间
3、标记-整理(Mark-Compact):应用场景---老年代
示意图
与标记-清除算法相同,但在清除阶段,存活的对象会向一端移动,然后清理掉端边界以外的内存。这种算法可以避免内存碎片问题,提高内存空间的利用率
回收前:对整个引用空间不连续的堆对象遍历
回收后:引用的对象空间连续,清除:没遍历全部,清除存活对象以外的空间
优点:空间连续,节约空间
缺点:标记耗时
4、分代收集算法:分代收集算法就是目前虚拟机使用的回收算法
这是一种综合应用,根据对象存活周期的不同,将内存划分为几个部分,如新生代和老年代。
- 新生代采用复制算法,因为大多数对象很快就会死亡;
- 老年代则采用标记-整理算法,因为老年代中的对象存活时间较长。
这种算法结合了复制算法和标记-整理算法的优点,既提高了效率又减少了内存碎片,是目前JVM中广泛采用的一种垃圾收集策略。
垃圾收集器
1、串行收集器
特点:单线程、会暂停用户线程
- Serial收集器,年轻代
- SerialOld收集器,老年代
2、并行收集器:
特点:多线程、会暂停用户线程
普通:
- ParNew收集器--年轻代
- ParNew收集器对应老年代一般为CMS收集器
吞吐量优先:
- Parallel Scavenge收集器,应用年轻代
- Parallel Old收集器,应用老年代
3、并发收集器
特点:停顿时间优先,可以交替运行
- CMS收集器,应用老年代,标记清除算法(不用标记整理是因为,整理后对象地址发生变化,用户线程对象运行中,会改变地址,如果有引用则会出错)
优点:并发收集、停顿时间短
缺点:产生空间碎片、对cpu要求稍高、无法处理并发阶段产生的垃圾
- G1收集器(jdk1.9默认),新老生代都适用,标记整理算法
在完善中......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律