当前课程知识点:JAVA程序设计进阶 >  第六章 Java虚拟机 >  6.4 判断对象是否存活算法及对象引用 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《JAVA程序设计进阶》慕课在线视频列表

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方法的话

你永远获取到的数据值都是空的

所以这样的一种引用方式

我们也就称之为幽灵引用

这种幽灵引用或者虚引用

它主要是用于检测我们的对象

是否已经在内存中被删除了

这是它的一个很重要的作用

那关于这部分内容

我们就介绍到这里

JAVA程序设计进阶课程列表:

第一章 线程(上)

-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

第六章 Java虚拟机

-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

第七章 深入集合Collection

-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

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。