栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习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()方法。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/713471.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号