Java是如何判断对象是否需要回收的?

常见的两种判断的算法:

  • 引用计数算法
  • 可达性分析算法(Java使用的这一种)

引用计数算法

引用计数算法是在对象中加入一个计数器,当对象被引用,计数器+1,当引用失效,计数器-1

这种算法实现简单,效率高,但是有一个严重的问题会导致内存泄漏,那就是对象之间循环引用,比如说A对象持有B对象的引用,B对象持有A对象的引用,那么A和B的计数器值永远>=1,也就是说这两个对象永远不会被回收

可达性分析算法

Java中定义了一些起始点,称为GC Root,当有对象引用它的时候,就把对象挂载在它下面,形成一个树状结构,当一个对象处于一个这样的树里时,就认为此对象是可达的,反之是不可达,如下图
这里写图片描述
如图 Object1,Object2,Object3是对象可达的,Object4,Object5,Object6是不可达的

那么有哪些可以作为GC Root呢?

  1. 静态属性(被static修饰的属性)
  2. 常量(被static final修饰的属性)
  3. 虚拟机栈(本地变量表)中引用的对象
  4. 本地方法栈中引用的对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值