00:00
好,各位同学。我们继续,那么上面我们已经完成了快速的前提复习,那么接下来咱们呢,过一下这些东东,那么不用多说。非常的不容易,同学们呢,几乎呢又要掉一层皮,我也非常清楚,有些同学呢,已经学的呢。到顶点了。没办法,我们再压你一下。那这个时候,尤其是南山。不累是假的。但不怕累是。真的。狼,我请你吃肉,狗,我请你吃屎。帝都混的男生。北京混的爷们儿明说了没能力,你最好别留在这个城市,省得给北京添堵。实力方是王道,你打仗的时候,能依靠的只有你自己,没有人来帮你。那么这个时候呢,请大家思考一下。
01:00
美国为什么敢打伊拉克?怀疑伊拉克有大规模杀伤性武器?那么请问美国为什么不敢打俄罗斯?因为俄罗斯真的有大规模杀伤性武器。所以说,战场较量,实力为王。继续。加强硅谷学子们的实际一线知识和工作技能。好,那么接下来。大家呢,允许大家呢现在哈,呃,站到后面的话呢,这个站起来听,或者教室呢,接点热水,我们晚上再加加班。冲一下咖啡喝着干是吧,杨哥也是干着喝着红牛干嘛,对吧,无所谓。生死看淡,不服就干,只要学不死,就往死里学。加油。Gbm垃圾回收的时候如何确定垃圾?是否知道什么是GC root?什么意思呀?GC root如何确定的?哪些对象可以作为GC root?
02:07
Java的锁S的原理,我们都用什么?Monitor entry monitor exit那些汇编都看过了,所以说同学们跟着来又考到了。那么首先哈。Java垃圾回收的时候呢,如何确定对象?他是个垃圾。那么什么叫GC root呢?我们来看一下这道题的解析。首先。什么是垃圾?简单来说,就是内存中已经不再被使用到的空间。那么就要是垃圾。那么我们在。去年刚入门的时候一定讲过,那么比方说哈。什么破损P等于烂了没有?这个饮用。指向任何实例对象了,慢慢的它呢,这个对象呢,干嘛也就会被回收了那么好。然后要进行垃圾回收。
03:00
前提反过来讲就是要回收垃圾,那么你要判断这个对象是不是将要成为垃圾了,是不是可以被回收,那么有哪一些判断方法呢?这个东东又是什么呢?那么首先第一种俗称引用计数法,那么前面我们复习过。第一个。用这个计数器吧,内部的来判断是否可以回收。每一个地方引用它就加个一,每一个地方不断引用它,引用失效了就减个一,那么这个呢,我们讲过。很难解决循环互相引用的问题,所以说这种呢,不再多废话,关键现在外面考的就是是吧,你不能说跟项目经理回答一个考官。技术经理回答一个,这个为难就是说明没他不指向任何对象,没有被引用了就回收了,那根本不是人家想听的。那么这个时候你一定要说一下干嘛,怎么确定他是垃圾?GC root。GC垃圾回收,Root。
04:03
垃圾干。能这么理解吗,同学们?我们过来。简单一句话,什么概念呢,俗称。每举根节点做可达性分析。也就是说,根搜索路径算法。那么好,这是个什么意思呢?来,同学们。首先我们为了解决上面哈引用计数法的循环引用。我们呢,不再使用这个计数法了,我们再用可达性分析,那么也就是说对于我们的复制标清标整,也就是标记压缩啊,也就叫标记压缩算法,或者叫标记清除整理压缩算法,我们简称哈复制标清标整,那么都要使GC引用便利,那么大家请看这个就叫根。GC root的根从根开始,假设它指向了BB又指向了B1和B2,它们就是一条链上的蚂蚱,这个时候就说明他们对象可达。
05:08
但是比如说对象C没有从GC root开始指向它,基本上它就成为对象不可达。好,那么这个是一个非常简单的说法,别着急,GC root啰嗦着呢,还有一些概念,那么好。那么它呢,就是一组必须是活跃的引用,言下之意就是就像跳棋一样的中间链子不断123,那么它的基本思路就是通过一系列名为及时root的对象作为什么点啊?起始点,也就是要从GC root的对象,这句话很关键,那么也就是说要从GC root的这些对象开始作为起点,那么反过来马上就会有一个问题,哪些对象可以作为GC root?这是第一个问题,但是待会儿我们讲,现在同学们先跟着我走整体思路,咱们再说后面的细节,也就是说。
06:06
先从GC root的对象作为什么点起点,就是从这开始走。那么从这个被称为GC root的对象也就从根子开始走向下搜。如果一个对象到GC root没有任何引用链相连的时候,到不了它,覆盖不到它。链子勾不上它,比方说像这个对象C,则说明此对象不可用,将会被。垃圾回收。那么也就是说我们要给定一个集合的引用。作为跟出发。集合。请问一般我们说集合是装一个还是多个,是多个,那么这个集合什么意思啊?GC root对象,那么刚才我提过第二遍,再说哪些对象可以作为GC root,那么好。这一大堆对象,他们的引用作为根的出发点,通过引用关系便利这些对象图。
07:04
能被便离到的就叫可达,那么这个对象就被判定为存活,就不能回收,但是如果没有被便利到的,那么就会被判定为死亡,那么这个时候俗称什么不可达,那么这样叫等待着被回收。也就是说简单一句话就是从GC对象。开始作为起点来进行链路的扫描和访问,如果能够可达,就认为这个对象还是活跃的,不能收。如果已经覆盖不到链条上,你不是这个链条上的一个环节。那么你呢,就是不可达,但有个前提,这条链条的起点必须是g c root对象。带着我们的问题,哪一些对象可以作为GC root对象呢?那么这个时候来,同学们,首先我们先说可达性分析跟搜索路径什么意思呢?
08:02
来。也就是说从我的GC root开始,要从这个根子,从这个点,这个呢,就有点儿像我们Linux的那个左斜杠。树形根目录那个根节点一样。那么这个就叫GC root对象从这种起点开始啊。那么假设OBJECT1。三四能够完整的从上到下扫描,便利通过,那么这个时候就叫引用,可答这个左边的就不能被回收。但是注意,请看。现在什么情况啊,这个GC root还有吗?没有了,不是从GC root这个起点开始啊,虽然说在这个里面五跟六。五跟七他们之间互相引用,但是抱歉。没有从GC root开始啊。言下之意,你呢?
09:00
虽然说你们内部存在着引用,但是这种东东就叫引用不可达对象。好,那么这种情况下,我们来看这张图,GC root set,那么这个是不是叫一个集合的意思呀?那么言下之意,哪一些对象可以成为GC root,那么也就是从这些对象作为起点开始来进行链路的便利访问,能够把它穿起来,这个就叫。对象可达,如果不能穿起来,头都没了。就算你们内部互相引用,也称为引用不可达。那么举个简单的case啊。兄弟,你去江湖上混。干嘛都会问?这位兄弟。请问你师出何门何派?你师傅是谁?那么言下之意,人家是不是问问你的GC root,看看兄弟惹不惹得起,你爆出来干嘛?武当张三丰是我老大,那么这个时候。
10:04
江湖上混的兄弟都会给你一点薄面,不会把你当垃圾给收了,因为上面是不是有人罩着你,所谓朝中有人好做官儿,你的起点是出身于名门正派。但是抱歉,问了以后你说你无门无派,你师傅是谁,不知道这个时候有可能你是不是被干死,引用不可答,那么再说直白一点干嘛?我们呢,再举一个生活的小case吧哈,比方说现在我们有三个类,一个是人类,一个是狗类,一个是毛衣类,那么假如说哈,现在我就是人,杨哥在遛狗,我牵着一条狗,这个狗身上又穿着一件毛衣,那么言下之意哈,那么现在三个对象强引用人牵着狗,狗身上穿着衣,比方说我们那个public class里面有一个对象叫DOGDOG对象里面又有个毛巾哈,假如说这么理解,那么突然发现不好意思啊。
11:01
现在干嘛呢?从GC root这这个主人已经没了。只有狗身上。穿着一个毛衣,虽然说狗和毛衣它们两个在互相引用着。还在?可达,但是抱歉,从这根子上开始,已经没有人牵着你了,有可能这只狗就会被别人误认为是流浪狗,那么前一段时间是不是有过这些,有一些流浪狗就被收容了,那么言下之意,这个就是属于什么我们的引用不可达,那么所以说第1.1定要从GC root开始啊,来进行完整的链路覆盖,能够勾得上才叫引用可达。不能回收,否则没有从GC root开始啊,抱歉,就算你们内部互相引用了也是不可达。好。那么接下来我们就来看,那么在Java中哪些可以作为计系数的对象呢?那么呢,总共有四种,切记这句话,干嘛我们。
12:07
Sat sat是不是个集合,集合就说明多个,那么也就是说有哪些角色可以成为GC root的灯呢?那么从这些地方开始变列,那么分别是虚拟机占中的引用的对象,那么也就是什么局部变量区也叫局部变量。第二个方法区中的类的静态属性引用的对象,第三个方法区中常量引用的对象,第四个本地方法中native当中引用的对象,那么从这四个起点出发,作为g c root去并列对象可达,那么这种情况下就不能被回收,否则就是引用不可达,这个就叫g c root的跟链路。扫描和哪些对象可以成为GC root?好,那么。再来给同学们加深。
13:01
比如说哈,同学们,我们都写过。PSPC等于6PS,那么你懂的,这个时候说明什么?是不是左边等号,左边是叫一个引用,右边是叫一个实例对象,那假如说哈,我们这现在呢。有很多很多很多的对象,那么假设这是什么O1,这是O2,那么这个呢是O3,好,那么这个时候这是什么O4啊。好,那么这个时候这个呢是O5,好,那么这个时候假设这是O6 OK,那么在我们的GPM里面有各种各样的对象,那比方说P。干嘛,从我们的这个规矩什么意思啊。占中引用的对象,那么指向他,比方说啊,我们现在外面从战中,比方有引用的来着他。好。
14:00
然后呢,一又引用着二。二呢,又引用着我们的三,那么言下之意,只要你来自于我们的这个root起点,那么说明什么?你这个东东就俗称对象可达。但是呢,非常抱歉,比方说你这有个六好。好,甚至还有多重引用。别的地儿也引用这三。言下之意就是这些都是从GC root来的。那么这个就叫引用可达,但是假设四和五呢?就算你们两个之间是互相引用的,你无门无派,外面根本就没有一个GC root来指向你,那么抱歉,这个就是不可达。那么这呢,顺便呢,我也给大家呢,写了一个最简单的哈,那么假设我们这有一个对象。GC root DEMO码。第一种。占中引用的对象,那么大家都明白,那么呢,假如说我们现在这是main方法,Main方法一定要调用M1,那么M1这个方法哈,我又写了以后,这有个T1,那么言下之意,是不是方法是要在站里面的,这是不是在这个方法的作用于里面有一个局部变量,这个T1,这个T1就是虚拟机站中引用的对象,那么这个T1就指向了一个这么一个对象,那么这种东东就叫对象可达。
15:25
好。第二种情况干嘛方法其中的类的静态属性引用的对象,那么当然哈,我这就没有再你有这么一个对象了。你可以把它当做就是假设这个对象里面又引用了另外一个对象,并且还是static,我们都讲过static是什么?是不是静态的,静态的是一份全部实例变量共用,那么它被加载进了方法7JAVA7,方法七叫永久带JAVA8变成永空间,那么沿下直线,如果说有别的地方引用像这样静态的,那么也是一种有点我们类似于这样干嘛。
16:05
从GC root的一种角色,第二种角色,那么就是类的静态属性引用,也有东东指向它,这种也称为引用可达。那么第三种方法,其中常量引用的对象,那么言下之意啊,同学们,那么刚才说过了,我呢就没有再写二和三这样一个东东,那么比如说我们这有个static final,像这样是不是也是是一个常量引用啊,那么像这样也可以作为GC root的对象,那么如果从这开始弄过来,而且还是静态的,那么这些就是强引用,不容易被回收掉,那么所以说第四种,那么当时我们的native那么讲过讲,比方说在线程里面就是词大的方法就叫native方法。那么OK,那么所以说在这最终要明白就是两个知识点,什么叫GC root。来从。以这四种对象角色作为起点的一系列g c root的集合里面,自顶向下,那么这个set就是刚才我们所说过的这四种里面的任意一种。自顶向下,如果能够找到,形成完整的引用链,这个就叫引用可达,如果不能引用不可答,那么将会被回收。所以说这道题目主要让你答两点。
17:22
第一种干嘛?根节点的可达性分析从GC root开始。第二个什么叫GC root是一组四种对象的。跟集合体,从它们作为垃圾回收扫描的起始点,OK,那么呢,这个就是我们对GC root相关的介绍和讲解。
我来说两句