JVM学习笔记3-垃圾回收算法

本文详细探讨了垃圾回收算法,包括标记-清除、标记-整理(如任意顺序、线性顺序和滑动顺序),以及分代收集策略,特别关注了如何处理内存碎片和不同区域对象的回收策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stop The World

GC和应用同时运行,可能在GC期间,新增了对象引用,但是这个对象被GC了的严重问题。

所以在GC的某个环节,需要暂停应用运行。

垃圾回收算法

标记 - 清除(Mark-Sweep)算法

会产生内存碎片,String和数组等需要连续的内存空间来存储。

标记 - 整理(Mark-Compact)算法

整理的顺序:任意顺序,线性顺序,滑动顺序

任意顺序:

优点:实现简单,执行速度快。两次遍历。

缺点:适合处理固定大小的对象,如果大小不一样会增加处理逻辑。

可用双指针算法

对撞指针:头指针找空闲空间,尾指针找已用空间,然后交换位置。两个指针对撞后,各自返回更新指针引用地址。流程:复制对象→更新引用→清理服之前的空间

线性顺序:有引用关系的对象整理到一起。

滑动顺序:

Lisp2算法:3次遍历速度慢一些;能处理大小不同的对象。需要一个额外的空间记录内存空间移动位置。

第一次遍历:记录内存移动信息

一个指针找空闲内存,一个指针找可达对象

第二次遍历:修改引用关系

第三次遍历:移动对象位置

单次遍历算法:1次遍历,需要额外的表来记录:标记位向量,偏移位向量,内存索引号。

一次遍历完成记录,然后根据记录完成对象移动和索引更新。

需要用能够创建和标记指针的语言来实现。

把内存分成很多块,标记位向量:记录内存开始和结束位置。

偏移位向量:只记录开头不记录结尾,移动到哪里。

算法是抽象概念,不同厂商,不同垃圾收集器实现会有差异。

分代收集

不通区域使用不通的垃圾收集策略。

young区:对象快速产生,快速回收,仅有少部分会留存。GC频率高, 使用复制算法。

old区:对象存在时间长,GC频率低,次数少,对效率容忍度高,用标记整理算法,有充分的时间进行标记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值