GC垃圾回收
2024-05-23 16:29:37 30 举报
AI智能生成
GC垃圾回收机制
作者其他创作
大纲/内容
如何判断某个对象是垃圾
引用计数算法
<span style="font-size: inherit;">通过判断对象的</span><b style="font-size: inherit;"><font color="#f15a23">引用数量</font></b><span style="font-size: inherit;">来决定是否要回收</span><br>
<span style="font-size: inherit;"><font color="#c41230">每一个对象实例都有一个计数器,当被引用时+1,完成引用则-1</font></span><br>
<b style="font-size: inherit;"><font color="#f15a23">引用计数为0</font></b><span style="font-size: inherit;">的对象被当作垃圾回收</span><br>
可达性分析算法
<span style="font-size: inherit;">通过判断对象的</span><b style="font-size: inherit; color: rgb(241, 90, 35);">引用链</b><font color="#381e11" style="font-size: inherit;">是否可达</font><span style="font-size: inherit;">来觉得对象是否要被回收</span><br>
通过一系列的称为<b><font color="#f15a23">GC Root</font></b> 的对象作为起点
<b><font color="#0076b3">栈中的引用对象</font></b>
方法区中的常量引用对象
方法区中的静态属性引用对象
本地方法中的引用对象
活跃线程中的引用对象
从这些节点向下搜索,节点所走过的路径称为<b><font color="#f15a23">引用链</font></b>
<font color="#c41230">当一个对象没有被任何</font><b><font color="#fdb813">引用链相连</font></b>,<font color="#c41230">则证明它是不可达的,即被垃圾回收</font>
垃圾回收算法
复制算法
将内存分为两个部分from to
将对象储存在to,并且将from中的对象存储到to
然后将from 和to交换位置, from变为to,头变为from ,to中永远为空
标记清除算法
标记:从根集合进行扫描,<b><font color="#f68b1f">对存活对象进行标记</font></b>
清除:<font color="#f1753f"><b>对堆内存进行遍历,回收没有标记对象</b></font>
缺点:会产生大量内存碎片,无法存储较大对象
标记压缩(标记整理)算法
<font color="#c41230">标记清除算法优化</font>将内存碎片进行整理移动
影响性能,代价较大
分代算法(不同内存区采用垃圾回收算法不同)
<font color="#f15a23"><b>年轻代:使用复制算法</b></font>
<font color="#f15a23"><b>老年代:使用标记清除,标记压缩(整理)算法</b></font>
垃圾收集器种类
Serial Old 收集器(标记整理算法)
单线程收集,进行垃圾会收集时,必须是单线程
ParNew Old 收集器(标记整理算法)
多线程收集,垃圾收集的工作线程可同时执行,吞吐量优先
CMS 收集器(标记清除算法)
垃圾回收线程和用户线程几乎可以同时工作
0 条评论
下一页