垃圾收集器与内存分配策略

那些内存需要回收

什么时候

如何回收

因为内存溢出、泄露问题,我们需要了解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、标记-整理算法

通过分区空闲分配链表解决内存分配问题

 

posted @   ZZ4582  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示