垃圾收集器与内存分配策略
那些内存需要回收
什么时候
如何回收
因为内存溢出、泄露问题,我们需要了解GC
判断对象是否存活的算法:
引用计数算法
在对象中添加一个引用计数器,每当有一个地方引用他时,计数器+1,反之-1,任何时候,计数器=0就是不可能在被使用
实际上虚拟机并不是通过引用计数算法判断对象是否存活
面试可以用到
可达性分析算法
通过一系列称为“GC Roots”的根作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走的路径称之为“引用链”,如果某个对象到GC Roots没有任何引用链相连,证明这是不能再被使用
生存还是死亡
如果对象在进行可行性分析后发现没有与GC Root相连接的引用链,它会被第一次标记,随后筛选,条件是对此对象是否有必要执行finalize()方法,加入对象没有覆盖此方法或者finalize()方法被虚拟机调用过,则视为没必要执行
若被判断有必要执行finalize()方法,那么对象将会被放置在F-Queue队列中
稍后收集器将对F-Queue中的对象进行第二次小规模标记,如果对象在finalize()中拯救自己,那么在第二次标记之前将被移除“即将回收”的集合,否则将会被回收
finalize()能做的所有工作,try-catch能做的更好
1.1分代收集理论
绝大多数的对象都是潮生夕灭
熬过越多次的垃圾回收的对象越难以消亡
在新生代中,每次垃圾回收都会有大批的对象死去,但活下来的对象会逐步晋升到老年代中存放(好像是15次)
1.2标记清除算法
先标记处所有需要回收的对象,统一回收未被标记的对象。
如何判定是否会标记,就在《生存还是死亡》一章有写
缺点:执行效率不稳定,进行大量标记与清除,随着对象增长而效率降低
内存空间碎片化问题
1.3标记复制算法
分为伊甸园、from区,to区
to区永远是空的
首先伊甸园标记清除,将获得对象复制到to区,然后from区与to区互相交换
缺点:
浪费一半的空间
存活率较高的情况下,一直复制会导致效率变低
1.4、标记-整理算法
通过分区空闲分配链表解决内存分配问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?