学习JVM之垃圾收集01——初见垃圾收集和生死判定

学习JVM之垃圾收集01——初见垃圾收集和生死判定,第1张

学习JVM之垃圾收集01——初见垃圾收集和生死判定

如果本篇文章是你第一次打算了解垃圾收集,非常荣幸,我应该不会误人前途。哈哈哈哈哈哈哈哈哈哈哈哈哈

目录

什么是垃圾收集?

谁是垃圾?

引用计数算法

可达性分析算法

注意啦:不可达也不代表 “必死无疑”


什么是垃圾收集?

也叫做垃圾回收机制,英文是Garbage Collector,简称GC。

垃圾收集就是回收内存中没有用的数据,释放内存空间。

需要解决的问题有三个:

    谁是垃圾?(回收哪些内存)什么时候收?怎么收?
谁是垃圾?

        Java语言,一切皆对象。我们把 “死去” 的对象视为垃圾。

        死去 :意味着不可能再被任何途径使用。可以这样理解:我们找不到这个对象了,这个对象的引用已经失效,无法被定位,无法被使用。

判断对象的生死主要有两种方法可以使用:

    引用计数算法可达性分析算法
引用计数算法

        对象当被引用时,计数 +1;

        当一个身上的引用失效时,计数 -1。

当对象的引用计数为 0 时,可以认为他的身上没有引用存在,已经“死去”。

但是这种方法会出现一些意外,往往需要其他方法配合解决这些意外状况的判断。

比如:可以想象一下链表的两个节点 A 和 B 仅拥有对方的引用。但是没有人的next = A或者B。节点A、B已经跟头结点失去联系。此时这两个对象已经无法被访问,两个对象身上的引用计数都为不是 0 。

A.next = B
B.next = A
可达性分析算法

        Java使用的就是这个算法。

        算法思路:把一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有引用链相连, 即从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

GC Roots 可以理解成能够直接访问到的引用起点。

注意啦:不可达也不代表 “必死无疑”

        可达性分析算法在判断死亡时,至少要经历两次标记。

    如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记。

    查看对象是否有必要执行finalize()方法(有关介绍在下面),如果有必要执行,则被放在叫做F-Queue的队列之中。如果在执行finalize()方法之后,对象变为可达对象,则被移除队列。剩余在队列中的会被二次标记,基本宣告去世。如果没有必要执行,那就不废话了,没得救了,直接去世。

        finalize()方法是Object类中提供的一个方法,在GC(垃圾回收的简称)准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。

早睡早起,注意身体。早起之王祝你风生水起。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5710120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存