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

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

目录

什么是垃圾收集?

谁是垃圾?

引用计数算法

可达性分析算法

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


什么是垃圾收集?

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

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

需要解决的问题有三个:

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

谁是垃圾?

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

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

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

  1. 引用计数算法
  2. 可达性分析算法

引用计数算法

        对象当被引用时,计数 +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 可以理解成能够直接访问到的引用起点。

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

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

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

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

        finalize()方法是Object类中提供的一个方法,在GC(垃圾回收的简称)准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用 过,那么虚拟机将这两种情况都视为“没有必要执行”。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值