当前课程知识点:JAVA程序设计进阶 > 第六章 Java虚拟机 > 6.4 判断对象是否存活算法及对象引用 > Video
这一节我们将介绍
在逻辑回收机制中
如何去判断对象是否存活的算法
以及对象引用
什么是垃圾回收
当我们的Java程序
在运行过程当中
某一个对象如果没有引用
指向它的时候
这个对象就会成为无用的内存
我们也把它称之为垃圾
这个时候就必须进行回收
那回收的目的
就是要为将来
其他对象的内存分配做准备
那垃圾回收机就相当于
我们住在一个房间里面
这个在生活过程当中
肯定会产生一些垃圾
那是不是有垃圾这个打扫员
来去帮助你把这个垃圾都回收
那我们在写Java程序过程当中
大家都知道
我们用生成一个对象的时候
只需要用new方法就可以了
new后面跟着一个构造方法
就可以实力化一个对象
然后会给它分配内存
但是我们不需要delete
如果大家用C或者C++的话
当你一个对象用完的时候
你还得负责delete
但Java当中好处就是
你不需要自己delete
那你不需要自己delete的话
那肯定是有人帮你去
把内存进行回收
那在Java当中
就有一个系统级的线程
来帮助你回收这些垃圾
那这个系统级的线程
如何去做到这个垃圾的回收
因为刚才我们也看到了
我们垃圾回收的这个定义就是说
我们任何一个对象
没有一个引用指向它的时候
那它就成为无用内存成为垃圾
那所以我们最简单一种方法
就来实现一个引用技术算法
也就是说我们针对每一个对象
我们看我们给它设置一个引用计数器
看看有多少个引用指向它
那这种思路的话实现比较简单
判断效力也比较高
在大部分情况下
看起来都是一个不错的选择
但是这个Java语言
并没有去使用这种引用技术算法
来管理我们内存的回收
其中最主要的一个原因就是
它很难解决对象之间
相互循环引用的问题
比如我们看下面这个例子
ObjA.obj=ObjB
然后ObjB.obj=ObjA
那这是什么意思呢
也就是说两个对象互相引用
A有引用指向B
B也有引用指向A
那当其他所有的引用
都消失了以后
这两个对象ObjA和ObjB之间
还有一个相互的引用
也就是说这两个对象
引用计数器的值各为1
那这样情况下说
我们还不能对它进行回收
但是实际上这两个对象
它都没有额外的引用
本身说明它们已经没什么用了
它也已经是垃圾了
但是由于我们
如果只简单的采用引入计数算法的话
我们还不能够把它进行回收
所以光光使用这个引用计数算法的话
这还是不够好的
那我们就想出另外一种这个算法
来去对它进行这个分析
那另外一种方法
叫可达性分析算法
有时候也叫根搜索算法
一般其他的这些商用的编程语言
比如Java C#当然它是用
都是用这种可达性分析判断对象
是否存活的
那这种算法的基本思路是这样的
它通过一系列名为GCroot的对象
作为起始点
GC也就是garbage collection的缩写
GCroot就是它的根节点
那从这些节点开始往下搜索
搜索所走过的路径
称为引用链 也叫(英文)
当一个对象到这个GCroot
没有任何引用链相连时
就证明这个对象是不可用的
那这个称为根搜索算法的话
是从离散数学的图论中引入的
程序把所有引用关系看作是一张图
那我们从某一个节点
GCROOT开始
如果一个节点与GCROOT之间
没有任何引用链存在的话
那这个节点
我们就视为是可以进行垃圾回收的对象
在Java语言当中
我们可以考虑作为GC Root对象的
包括以下几种
第一种是我们虚拟机栈
它那里面的所引用的对象
或者是我们方法区中的类静态属性
引用的对象
或者是方法区中的常量所引用的对象
或者是我们本地方法栈中
这个JNI这个Java本地接口的
引用的这个对象
而这几个 几种的对象
都可以作为我们这个根搜索
算法中的这些根
然后我们再去找出
有没有其他的对象的这个引用
引用链指向它
这样的话我们就能分析出来
到底有哪些对象
它是成为垃圾
进来就把它进行回收
那下面我们看一下
我们在编程序过程当中
对于对象引用的话
到底有哪些类型
会影响到我们的Java的垃圾回收
首先就是我们普通意义上
我们去声明一个对象
然后通过new方法
调用它的这个new
调用它的构造方法
来去返回这个对象的引用
那这样的一种方式的话
我们称之为强引用
强引用就是说只要这个引用存在的话
我们的垃圾回收器的话
一般就不会回收它
那只有当这个Obj这个引用被释放之后
对象才会被回收
那怎么释放引用呢
也就是简单的你把Obj
你可以把它设置为空
Obj等于null
这就是一个释放引用的过程
那另外一种对象引用方式
我们也可以把它这个
称之为软引用
软引用的话
它是在内存溢出之前
去把它进行这个回收
比如说我们看下面这么一段代码
Object oby=new object
那我们紧接着定义一个
SoftReference object sf=
new Sort Reference objectObj
那我们把我们的Obj这个引用
把它转化成一个软引用
soft reference
紧接着我们把Obj等于null
把它置为这个空
然后紧接着sf.get
那这时候是sf对object的一个软引用
通过sf.get方法
可以获取到这个对象
当然当这个对象
被标志为需要回收的对象时
它就会返回的是空
所以说软引用主要用户
来实现类似缓存的功能
在内存足够的情况下
我们可以直接通过软引用来取值
而不需要从繁忙的真实来源
去查询数据提升速度
那当内存不足的时候
就会自动删除这部分的缓存数据
然后从真正的数据来源当中
去查询这些数据
那我们对象引用的另外一种情况
还可以叫做弱引用
弱引用是在第二次垃圾回收的时候
再回收
比如我们看这个代码
object Obj=new object
然后Weak Reference弱引用
object wf
然后再进行构造实力化
然后紧接着Obj赋值为空
然后wf.get就是要得到它的这个引用
然后wf.is enqueued
就是是不是一个队列
那弱引用是在第二次
垃圾回收时才进行回收
短时间通过弱引用
去访问对应的数据
可以取到
当执行过第二次垃圾回收的时候
可能这时候它这个弱引用就被回收了
那弱引用主要用于监督对象
是否已经被垃圾回收器
标记为即将回收的垃圾
可以通过弱引用的is EnQueued方法
返回对象是否被垃圾回收器所回收
那还有一种引用叫虚引用
有时候也称之为幽灵引用
或者幻影引用
那这种引用是在垃圾回收的时候
就回收了
然后它也无法通过引用
取到对象值
那我们看下面的这个
这段代码object Obj=new object
然后phantomReference object pf
然后进行构造实力化
然后Obj把它赋为空
然后pf.get就是想获得它的这些
这个值
然后pf.is EnQueued
那这个虚引用的话
它是在每次垃圾回收的时候
都会被回收的
那我们通过虚引用的get方法的话
你永远获取到的数据值都是空的
所以这样的一种引用方式
我们也就称之为幽灵引用
这种幽灵引用或者虚引用
它主要是用于检测我们的对象
是否已经在内存中被删除了
这是它的一个很重要的作用
那关于这部分内容
我们就介绍到这里
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video