大家好,又见面了,我是你们的朋友全栈君。
GC算法简介
1、GC是一种机制,垃圾回收器完成具体的工作
2、工作的内容就是查找垃圾释放空间、回收空间
3、算法就是工作时查找和回收所遵循的规则
常见的GC算法
1、引用计数
2、标记清除
3、标记整理
4、分代回收
GC算法之引用计数算法
1、核心思想:设置引用数,判断当前引用数是否为0
2、引用计数器
3、引用关系发生改变时改变引用数字
4、引用数字为0是立即回收
代码演示如下
const user1 = { age: 10 };
const user2 = { age: 20 };
const user3 = { age: 30 };
const nameList = [user1.age, user2.age, user3.age];
function fn() {
num1 = 10
num2 = 20
}
fn()
function fn2() {
const num1 = 10
const num2 = 20
}
fn2()
//在这个全局作用域下 user1 user2 user3 nameList num1 num2
//上面的引用计数都不是0 所以不会被回收
//改造一下
function fn2() {
const num1 = 10
const num2 = 20
}
fn2() //一旦这行代码执行 也就意味着在全局作用域下找不到num1 和num2
//这个时候num1 和num2 引用计数都是0 这个计数器都会工作
//把num1和num2占用的空间进行回收
GC算法之引用计数算法优点和缺点
优点:
1、发现垃圾立即回收
2、最大限度减少程序暂停
缺点:
1、无法回收循环引用的对象
function fun3() {
const obj1 = {}
const obj2 = {}
obj1.name = obj2
obj2.name = obj1
}
fun3()
//虽然在全局作用域下看不到了obj1和obj2
//但是在内部还存在着引用所以 obj1和obj2的引用计数不是0
2、时间开销大
时刻要维护引用计数导致等待时间较长
GC算法之引用标记清除算法实现原理
1、核心思想:分标记和清除两个阶段完成
2、遍历所有对象找标记活动对象
3、遍历所有对象清除没有标记对象
4、回收相应的空间
总的来说就是两个步骤
第一步遍历所有可达对象 如果对象还有子属性的话进行递归操作继续遍历
遍历完成后就行标记
第二步找到没有标记的对象进行清除
GC算法之标记清除算法优点和缺点
优点:弥补了引用计数算法的不足,引用计数算法的缺点也可以是看到标记清除算法的优点
缺点:
1、标记-清除算法的比较大的缺点就是垃圾收集后有可能会造成大量的内存碎片
2、不会立即回收垃圾对象
GC算法之标记整理算法实现原理
1、标记整理算法可以看做是标记清除的增强
2、标记阶段的操作和标记清除一致
3、清除阶段先会执行整理,移动对象位置,把分散的对象整合到一起
GC算法之标记整理算法优点和缺点
1、减少碎片空间化
2、不会立即回收垃圾对象
谢谢观看,如有不足,敬请指教
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151614.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...