面试知识汇总——垃圾回收器(垃圾定义与回收算法思路)

定义垃圾的两个方法

引用计数法

记录对象是否被其他对象引用,当对象没有被其他对象引用就说明这个对象已经可以作为垃圾进行回收了。无法解决循环引用

可达性分析算法

目前主流判定java对象是否为垃圾的方法:通过一系列“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象不一定会成为可回收对象。进入DEAD状态的线程还可以恢复,GC不会回收它的内存。

分析过程

(1) 第一个阶段是可达性分析,分析该对象是否可达

(2) 第二个阶段是当对象没有重写finalize()方法或者finalize()方法已经被调用过,虚拟机认为该对象不可以被救活,因此回收该对象。

GC ROOT对象

(1) 虚拟机栈(栈帧中本地变量表)中引用的对象

(2) 方法区中静态属性引用的对象

(3) 方法区中常量引用的对象

(4) 本地方法栈中Native方法引用的对象。

回收算法

最基础的算法是标记-清除、复制-清除、标记-整理这三种算法,但是常用的垃圾回收器一般采用分代收集算法

Mark-Sweep(标记-清除算法)

(1)思想:标记清除算法分为两个阶段,标记阶段和清除阶段。标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间。

(2)优缺点:实现简单,容易产生内存碎片

Copying(复制清除算法)

(1)思想:将可用内存划分为大小相等的两块,每次只使用其中的一块。当进行垃圾回收的时候了,把其中存活对象全部复制到另外一块中,然后把已使用的内存空间一次清空掉。

(2)优缺点:不容易产生内存碎片;可用内存空间少;存活对象多的话,效率低下。

Mark-Compact(标记-整理算法)

(1)思想:先标记存活对象,然后把存活对象向一边移动,然后清理掉端边界以外的内存。

(2)优缺点:不容易产生内存碎片;内存利用率高;存活对象多并且分散的时候,移动次数多,效率低下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值