做神马网站优化排名,如何创建网站后台,如何做淘客网站源码,小型办公室中式装修一句话介绍GC#xff1a; 自动释放不再使用的内存
一、判断对象是否能回收
思路一#xff1a;引用计数
给这个对象里安排一个计数器#xff0c; 每次有引用指向它#xff0c; 就把计数器1#xff0c; 每次引用被销毁#xff0c;计数器-1#xff0c;当计数器为0的时候…一句话介绍GC 自动释放不再使用的内存
一、判断对象是否能回收
思路一引用计数
给这个对象里安排一个计数器 每次有引用指向它 就把计数器1 每次引用被销毁计数器-1当计数器为0的时候 意味着该对象就是垃圾了 但引用计数存在两个缺陷
1. 空间利用率比较低浪费更多的内存空间 给引用技术分配了两个字节 对象本体才4个字节 引用计数就浪费了50%的空间 如果代码中都是这种小对象 并且数量众多 此时 浪费就非常明显了
2. 可能存在循环引用的问题 导致对象不能被正确识别为垃圾 思路二可达性分析
JVM首先会从现有代码中的能直接访问到的引用出发 尝试遍历所有能访问的对象只要对象能访问到就会标记成”可达“完成整个遍历之后可达之外的对象也就是“不可达”也就相当于垃圾了 总结 可达性分析浪费时间 引用计数浪费空间 二、如何清理垃圾
1、标记清除 但会导致释放的空间是离散的 引起“内存碎片“
申请内存的时候 都是申请连续的内存空间。 直接释放内存会破坏原有的连续性导致还有剩余但是申请不了
2、复制算法
复制算法 通过冗余的内存空间 把有效对象复制到另一部分空间来避免内存碎片
但是浪费一半空间 把一个内存分成两份用FROM清理FROM搬到TO 往复进行
把左侧区域中有效的对象 复制到右侧
接下来就可以使用右侧区域了 用了一段时间后也会有很多对象也是同理把有效对象复制会左边对右侧进行统一释放
3、标记整理
把有效对象搬到一起 统一删除元素 当然这样搬运元素成本也比较高导致速度太慢 4.分代回收
其实上边三个方法都不行于是大佬们设计了一个综合方案
java代码中对象主要分成两类 1.生命周期特别特别短 2.生命周期特别特别长
GC是周期性的扫描一个对象每经过一轮GC就长一岁
分代回收就是按照对象的年龄来制定不同的回收策略 首先整个堆分成两部分 新生代 和 老年代
新生代又分伊甸区 和 幸存区 ①新创建的对象全部会放在新生代中的伊甸区 再经历一轮GC后剩余的还没挂的对象会通过复制算法复制到幸存区 幸存一轮后年龄1 ②幸存区由两块区域组成 每次只使用一块对已使用区域使用复制算法转移至未使用区域注意箭头指向 ③如果一个对象在幸存区中经过15轮都没挂 那就是生命周期特别长了直接转移到老年代,在老年代中使用标记整理
老年代扫描频率比新生代低得多并且即使扫描了大多数也不会被销毁因此标记整理开销不大
新生代扫描频率虽然高但是每轮留下的对象很少复制算法的开销也不大
垃圾回收总结 三、垃圾回收器