您的位置:首页 > 编程语言 > Java开发

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

2018-03-02 13:43 573 查看
常见的两种判断的算法:

引用计数算法

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

引用计数算法

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

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

可达性分析算法

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



如图 Object1,Object2,Object3是对象可达的,Object4,Object5,Object6是不可达的

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

静态属性(被static修饰的属性)

常量(被static final修饰的属性)

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

本地方法栈中引用的对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息