00:00
那么第一章呢,叫垃圾回收概述,那这一章里边呢,咱们要给大家分享这样几个问题,相对来说这一张也比较简单啊,第一个呢,叫什么是垃圾,第二个呢,为什么要,为什么需要呢?JC垃圾回收,那下一个呢,就是早期的垃圾回收的行为,我们看如何实现,那最后一个呢,就提一提Java的垃圾回收机制,OK,比较简单的四个问题,首先呢,我们来看说什么是垃圾,那有同学可能会想说这样问题还需要介绍吗?啊,那我要告诉你,就是一会呢,我们能看到一个大场面题,还竟然问了说什么是垃圾。有的时候呢,我们说越简单的问题呢,可能你就越难以去描述,那比如说我问大家问题,说什么是程序呢。啊,大家呢,都是程序员,每天呢都在写程序,那什么是程序呢。哎,你能不能说清楚呢?那什么是空气呢?对吧?哎,有时候呢,我们最常见的一些问题呢,哎,这个而易见的问题,显而易见的概念,可能呢,我们反而不太好描述,嗯,行,那什么是垃圾,那首先呢,咱们来看这个图,这个图里边呢,左边是Java,右边是C加加,那中间呢是一道城墙啊把这个Java呢和C加呢,就是给大家分开了啊,那么这道城墙呢,就是我们所谓的叫内存的动态分配和垃圾的收集技术。
01:08
那咱们知道呢,这个C语言当中呢,它没有这个内,这个内存呢,它是能够进行分配的,但是需要我们自己去指定是吧,它对指定指向呢,也是真实的一个内存的地址,然后呢,这个C里边呢,我们说是没有具体垃圾收集技术的。对吧,哎,这样个行为,那相较来讲呢,这个障碍言的话呢,我们呃当时讲说呃相较于这个C加加的一个区别呢,就是砍掉了这那些指针的概念,对吧?然后呢,咱们可以实现垃圾的自动收集,所以从这个角度来讲呢,咱们可以大家把这个Java语言呢,可以看作是咱们说叫这个C加加这门语言的一个简,简版本就是一个简,咱不能叫简配版了啊,相当于是把这个不必要的东西呢,咱们做了一个优化处理,看就这样一个情况,行,那么分成这样一道围墙之后呢,就像这个围城里边说的那句话,城里的人呢想出来,城外的人呢想进去。对吧,那Java呢,我们说在最初的时候呢,呃,希望呢,能够更高的性能上达到跟C一样,那你想想你真实的去处理这个真实的这个内存地址去分配,那如果你要处理的好的话呢,肯定性能呢是要更高一些,对吧,但是相对来说要更繁琐一些,那C加加程序员的话呢,就希望呢,像Java程序员一样,我不用呢去那显示的来确定说内存中我到底要把这个对象放在哪,以及呢,这个对象使用完以后呢,能不能自动的帮我们去回收垃圾,那C加加的成员呢,也非常的羡慕Java,对吧,就是大家互相彼此羡慕啊,就成这样一个情况,行,那下边我们来看一下这相关的一些点,首先呢提到叫垃圾收集。
02:35
能够确定的呢,就是这个概念呢,并不是Java语言的一个伴生产物,早在呢,1960年的时候呢,第一门开始使用内存动态分配和垃圾收集的技术的语言呢,叫类这个语言呢就诞生了。啊,伴随这个语言,我们后续的这个语言呢,其实都会涉及到这个垃圾的一些问题,那既然涉及到垃圾呢,我们就要去收集,那关于垃圾收集呢,有三个经典的问题。说呢,哪些内存需要回收?
03:02
什么时候需要回收呢?那如何回收呢?经典三问,那其实这三个问题呢,也适合于咱们生活中的很多问题,对吧?包括呢,讲哲学的时候,一谈到哲学,哲学呢,是不是有三个经典的问题,说我是谁?我呢,从哪来?我呀,要到哪去?真的这是哲学散文对吧?啊,类似的这样的道理,行,然后接着往下看,说垃圾收集机制啊,是Java的一个招牌能力,极大的提高了开发的效率。这相当于说咱们这个障va语言的一个特点,说如今啊,垃圾收集呢,几乎成了现代语言的一个标配,经过如此长时间的发展,垃圾的Java的这个垃圾收集机制仍然在不断的演进当中,不同的设备这个不同特征的应用场景,哎对垃圾收集呢提出了新的挑战,哎这呢也是面试的热点,那前面这些呢,大家诶也知道了,我刚才呢说过了,咱们在JDK不同的版本当中,即使呢是我们现在的这个JDK,每隔六个月呢,就要更新一个版本,你也会发现呢,是不断的去调整我们这个JC对吧,因为呢,咱要印度不同的这个场景和业务,希望呢,能够从这个JDK这个底层的层面上呢,我们让Java的性能呢就更强一些。
04:11
啊,更强一些,这个大家呢,不要浪费了像JDK开发人员的这样的一片苦心是吧,人家好不容易给你做了一优化,你上边写代码的时候写的很垃圾,那就完了是吧?哎,要想咱们整个这个最后做的项目,这个系统呢,性能最好,你得是上边也得好,下边也得好,那就得这么着,那下边做的再好,你上边写代码呢,写的特别糟糕,那也白扯,就像说呢,你买了一套非常高级的这个家里边的一套厨具啊,从德国买的进口的是吧,这个高级厨具,但是呢,你自己不会做饭,那整出来饭呢,他照样好吃不了。啊,你说呢,这个呃,你特别会做饭,然后用的这个灶台呢,非常的简朴,这个这个自己用木头去烧啊,那那其实你可能做出来的效果呢,也能挺好是吧?当然了,你要说这个厨房的工具又多又好,然后呢,你这个厨艺又高,那那是最好的。啊,那是最好的对吧。
05:00
一说到这儿呢,想起来这个李子柒了。啊,还是蛮好的啊,这个我好几年前呢,其实就看过他的视频,当时呢,我觉得真的其实是应该说挺有这个叫什么匠心的精神的哈,啊非常不容易,就是你一看他这个视频呢,就感觉眼前一亮,能感受到他是非常用心的在去做这个视频,那我觉得呢,其实当老师呢,也是一亮啊,这个录课也好,讲课也好呢,也应该是有这种匠心的精神啊,其实一定程度上老师呢,其实也是一个就像工匠一样,对吧,打磨的这个产品呢,就是要讲授这个课程,那需要呢不断的去优化啊,看看怎么能够让大家听的会更好一些啊行,这个一起努力啊,这个我我努力啊,大家呢,就是也可以随时的去提供一些建议啊行,然后下边呢,提到一个说这呢,也是咱们面试当中的一个热点问题,那很自然而然的,那面试当中都会问哪些问题,来,咱们直接上大场面试题。啊这呢就列举出来一些,比如说蚂蚁金服,蚂蚁金服里边呢,大家看到是不是就真问这道问题了,虽然说呢是在这个一面当中问的,啊说这个GC啊是什么,说为什么需要GC呢?那GC的这个两种判定方法是什么?CMS呢?垃圾数据器和这一垃圾数据的特点呢,各自是什么?你看这里边出现这个CMS这个机会呢,还挺多的啊啊那大家呢,是不是要关注一下,OK,然后呢,说一下这个JC算法,那分类回收呢,说一下回收的策略算法。
06:19
啊等等,这个垃圾回收器有哪些这一类应用场景,嗯,然后垃圾回收器的这个实现原理啊,算法的实现原理,什么情况下呢,触发垃圾回收哪三种呢?垃圾回收器啊,其实不止三种啊,就是它是让你举三种比较常用的,哎还有呢,c.JC让点JC这个咱们在这个诶关于垃圾回收这块的这个第三章当中,咱们去讲解。啊,就是咱们这第14章,就是在第15第16章当中,我们去讲这个问题,OK行,那这块呢,大家也能看到,呃,这些里边的题目在咱们这三章当中。哎,四章是吧,哎,这四章当中全部都会给大家讲解到,就至少我这块列举出来的这些问题啊,咱们全部都会讲解到啊,那大家也知道,咱们整个讲这个,呃,Gbm的话呢,我这块一共是分成了算是要四篇啊,实际上的话呢,也就三篇。
07:08
上篇中篇下篇就构成了咱们GM这个课程的一个全部了,那第四篇呢,写了一个大厂面试篇,实际上的话呢,嗯,就是针对一些有经验的人呢,可能来一个恶补是吧,前面这三篇呢,可能你没有过多的去细致的来看了,上来直接就走这个大二面试题,我觉得也可以,但是如果呢,大家走过这个上篇中篇和下篇之后呢,那第四篇的话,其实对于你来讲,你不看也没有关系,呃,我希望呢,讲课达到一个效果,就是说诶,咱们不会是为了针对于面试呢,咱们去讲这些知识点,而呢,真正的是我们把这个东西呢融会贯通了,那么面试题呢,仅仅是为了考察一下你是不是掌握了而已,就是说你背了一个结构长表,然后呢,大脑面试题里边就好比问一下三乘二等于几是吧,五乘六等于几,七乘八等于几,那只是呢,挑选了其中一些点呢去问而已啊,就是这样子的一个情况啊行,那咱们再回来这呢,就是这些大场面试题就比较清楚了。
08:01
那接着往后走,说什么是垃圾这块问题来了。垃圾是什么?这呢是我列了一个比较标准的一个答案,说垃圾呢,是指在运行程序当中没有任何指针指向的对象。那这个对象呢,就是需要被回收的。没有任何指针指向的对象,注意咱们Java当中变量呢,分成基本数据类型和引用数据类型。基本数据类型是不是不涉及到我们这里边所谓的时候,你这叫垃圾量啥的,对吧,它是咱们前面讲那个标量替换的时候,还记不记得陶逸分析里边提到个叫标量替换,它叫标量对吧?那咱们这样这个对象呢,称为叫聚合量,那这个聚合量呢,那也就是说这个引用类型的,咱们通常才考虑进行回收,哎,占空间一个引用地址一个reference占四个字节指向了我们对空间当中引用的这个对象,那现在呢,我们这个指针啊吧,这个占空间里边这个变量呢,对应的这个相当于是一个引用是吧,这个引用呢,是在我们某一个方法的战争这个局部变量表里边,然后这个方法呢,执行完了,这就出战了,一出战呢,我们这个引呢就没有了,那你对空间中的这个对象实体。
09:05
就不会再被赢到,那既然不会再被赢到,你是不是就是个垃圾了。你就是个垃圾对吧,那既然是垃圾呢,我们就应该被应该被回收,所以这个概念呢,其实很简单。那用这个英文来说呢,就是an object it considered garbage说呢,要被考虑呢,进行回收,当什么时候呢,It can no longer be reached,它不在呢,可以被到达,From any pointer in the running program,就是在运行的时候呢,我们没有任何的指针的指向了。那这时候呢,我们就要回收它其实就是我这句话的一个英文的对应版本,记住它,大家啊记住它下边提到说如果要是不及时的对内存中的垃圾进行回收的时候,进行清理怎么办呢?说这些垃圾呢,所占用的空间呢,就会一直保留到应用程序结束。呃,因为咱们知道一个应用程序,或者我们叫一个进程,咱们是不是就会对应着一个运行时数据区,那一个运营师数据区里边呢,就会有一份呢,对空间方法区,包括呢,咱们这些站结构,那你这些数据呢,就始终呢,占据在咱们这个方法区当中,那既然你没有这些,那什么时候消失呢?就是当我们当前这个进程呢,干掉的时候呢,咱们的运营师数据区呢就没有了,那没有的时候呢,这时候数据就全部清掉了。
10:17
那在我们这个应用程序呢,始终运行的过程当中,那你这个就没有清理过,那就会导致呢,咱们空间呢,可能就不足了,那空间不足,如果我们在试图去创建其他的对象,显然呢,是不是就出现叫内存溢出问题啊。导致内存溢出对吧,那一提到这个内存溢出问题呢,还有一个概念叫做内存泄露。那什么叫内存泄露问题呢?大家能够去举出来内存泄露的这个例子吗?这个在面试当中也会问到啊,那要是我的话呢,我可能不会刻意的区问啊,就是在面试当中,经常的面试官有一种状态是什么呢?就是针对你简历里边写的这样的一些点,就是逐条呢这块去深入啊,呃,这个这个按照你回答这个问题,咱们一点点去剖析一点剖析剖析剖析,这个我应该往下画啊,就越剖析呢,是不是就越深入啊,每到问题往下剖析剖析,那其实总有不同的场景下呢,就会问到这个内存的溢出和内存的泄漏问题了。
11:10
啊,举点例子是吧,看看你能不能说清楚。啊,有的时候呢,你真的去往上去背一些面试题的,呃,也能有些用,对吧,也能有些用,但是你要真正希望把自己发挥的更好,那还是得底层的一些情况呢,要更清晰一些。行,OK,过了啊嗯,这块呢是放了个图啊,就是前面呢,咱们说的是应用程序层面呢,叫JC啦,然后呢,就回想起来以前的时候呢,这个程序碎片整理的日子,不知道大家呢,有没有经历过这样的这个时光啊,我呢印象很深刻啊,就上初中的时候呢,我是有了自己的第一台电脑啊,这个是联想牌子的啊,这个台式机啊嗯,我感觉挺不容易的啊,这个当时在这个九几年的时候呢,在农村就能有一台自己的电脑哈,呃,当然了,这个我家不是说条件多好,就是普通的这个农民啊,这个可见呢,当时呃,父母呢对我这个教育呢,还是非常看重的啊,现在来看的话,还是挺感谢他们的,呃呃,当时呢,呃,在农村嘛,这个电脑也不可能说买的这个配置特别的高,对吧,但是在当时来讲呢,已经是嗯。
12:12
当时我记得应该是这个7000块钱左右买的啊,当时这个电脑的这个硬盘的话呢,是有十个G,那硬盘呢是十个G,那现在的话呢,咱们这个内存可能都比十个G还要多了,对吧?那当时的话呢,已经我觉得挺好了啊,那电脑的话呢,就是每用一段时间你就发现呢,这个明显呢就变慢了,然后我就去网上去搜,那时候刚开始还不太懂嘛,自己在那鼓捣是吧。孤岛,孤岛这是哪的一个词啊,就是研究琢磨是吧,这个意思,嗯,然后就说呢,你得进行这个磁盘碎片整理,那当时呢,就印象特别深的就是看到这样的图,那经常我有时候盯着这个图呢,就能看上好一会儿。因为呢,在这个磁盘碎片整理的时候呢,你也不能干别的操作。啊,你要干别的操作呢,相当于是你就有用户线程了,你用户线呢,就会影响到咱们这个垃圾回收啊,这个清理这个腾挪空间的这样的一个过程是吧?哎,这呢是后续这个版本的一个啊,就改成这样子了啊就是后边这是Windows的啊Windows叉P,这是WIN7的时候呢,这样的一个图,嗯,那那这块呢,叫磁盘碎片整理,那问大家一个,这个算是常识啊,这个磁盘碎片整理呢,我们现在这个电脑都还需要吧,或者需要吗?
13:21
啊,其实这块呢,主要针对的是咱们说这个不同的这个磁盘了,这个磁盘的话呢,我们说有这个叫机械硬盘是吧,机械的这个磁盘还有呢,叫固态硬盘啊不同的情况,那机械硬盘的话呢,是需要这个磁盘整理的,因为机械硬盘呢,它主要是通过改变磁极是表示这个零或者是一,那需要呢,我们进行碎片整理啊这样过程,那这个固态硬盘的话呢,它其实主要是靠不断的去添加这个电子是吧?诶添加这个电子,然后呢,这个呃,使得我们来表示这个数据。啊,那要从这个角度来讲的话呢,这个固态硬盘呢,我们不断往里边去塞电子的话呢,那那其实从一定程度上来讲,会导致我们的硬盘呢,是不是会越来越重是吧?啊以前呢,有人就问一个问题,说呢,我们这个往里边存数据啊,拿了一个硬盘往里存了很多数据存满了,哎呀,这个存满以后会不会特别沉。
14:10
啊,其实我其实现在呢,就是呃,我老妈是吧,呃,她就是啊,她买了一个手机,其实我我给她买了一个手机,其实呢,现在这个存储空间挺大了,但是她呢,呃,经常会时不时的把那些没有用的一些短信啊,一些图片啊就给删了,呃,就在他的这个感觉里边,这个手机啊,你要是不删一删他就特别沉啊,他就总想这个带着能轻一点啊,删东西啊,当时觉得还挺好笑的啊,那现在来看的话呢,就是如果你要是用的这个固态硬盘啊,那其实你不断往里塞电子呢,还是会变得沉一点是吧,只不过呢,咱们是感觉不出来而已啊,这样。还有一个呢,就是这个机械硬盘的话呢,它会有坏点是吧,经常我们会扫描呢,开用这个破扇区,那你要有坏点的话呢,需要把坏点周围这个数据呢,给它拷贝出来,那要不这个数据呢,就就没法再使用了。啊这种那对于机械硬盘啊,这个固态硬盘来讲,它的问题是什么呢?就是说它有一个叫呃,复制擦洗的一个次数,通常这个次数呢,其实这个值也不小,你用上几年时间呢,都没有问题的啊,就是一旦呢,你要超过他这个叫擦洗次数以后呢,这个数据你要在存到里边是有可能就被丢失了。
15:12
那这个大家就得小心一点,但是一般的话呢,你比如说我们这有一个G的一个固态啊,你把它完全写满的时候呢,它才认为是一次,比如我写完这一半了,这一半的话呢,它就相当于是半次,哎是这样的一个情况。嗯,行,这就咱们闲聊闲聊啊,行,这是第一个问题,然后下个问题呢,就是我们为什么需要JC。为什么需要GC说这个问题还需要,还需要解释吗?就是我们为什么需要空气。啊,没有攻击就死了是吧,我们需要进行这个氧化作用啊,这个为什么需要学习GC,那要想学习GC,需要了解为什么需要GC,嗯,那这呢,我列举出来三个原因,这三个原因呢,其实大家也可以想另外一个事,就比如说咱们为什么需要攒钱呢。为什么需要省钱呢?哎,我觉得跟这个问题呢,其实比较像哈,来来看一下,这里边解释说,对于高级语言来讲,一个基本的认知呢是如果要是不进行垃圾回收呢,内存呢,迟早就被消耗完了。
16:07
啊,那这个因为不断的分配内存,这个空间呢,不进行回收,那就像呢,不断的生产垃圾,从来不打扫一样,最后呢,就迟早就消耗完内存了,那就像说你为什么要省钱呢,为什么要攒钱呢?因为你要不攒钱的话呢,迟早有一天这个钱呢就花完了。啊,咱们说这个人生,呃,这个最痛苦的事情呢,说这个,呃,人没了,钱还在是吧,嗯,最最痛苦的事呢,就是人还在,钱没了。啊,这钱花完了是吧,这是我们说的第一个问题。那第二个问题说除了释放没有用的这个对象啊,这个垃圾回收呢,也可以去清理内存里的叫记录碎片,那碎片整理呢,将这个所占用的这个堆内存啊,移到这个堆的一端,然后以便呢GM整理出呃这个内存空间来分配给新的对象,那尤其呢,是你新的一个比较大的对象,需要这个连续空间的时候呢,我们来进行一个碎片整理呢,还是很有好处的。
17:00
啊,你能把这个整片的空间呢,给大家腾出来,对吧,这样那有点像咱们说你说为什么你要攒钱呢。啊,比如说你一个月呢挣5000,一个呢挣5000块钱花4500,嗯,就剩500是吧,那你可能这个剩下的就是日常开销呢,就有4500,然后剩下这500呢,你也干不了啥事了,那你如果说想买一个这个1万块钱的一个iPhone啊现在这个苹果手机呢,很贵了,想买个1万块钱iPhone,那你这块呢,是不是始终就买不了,一个月呢5000块钱,那日常开销呢就很多了,那始终呢也不行,那你就得攒钱对吧,攒钱呢你才有可能买一个大件产品是吧,只有呢,你进行这个碎片的整理呢,我们才有可能呢,去分配这个大的对象啊有点像啊这样一个概念,下一个说随着应用程序呢,所应付的业务啊越来越庞大复杂,用户呢越来越多,那没有这些呢,就不能够保证应用程序的正常运行。啊,这呢,其实也是咱们为什么要不断的进行这个GC优化的一个原因,因为咱们应付的这个场景啊,就越来越复杂啊,大家想想以前的时候,比如我们推到这个十年前啊,其实十年前好像还不行,还得再往前推一推,这个我上研究生的时候呢,其实已经当时有大数据的这个概念了,那谷歌的话呢,其实在这个零几年的时候就发布了这个相关的几篇论文,是吧,诶非常具有重量级的这个论文了,那么这个应该说是2010年之后呢,咱们国内的大数据的从概念才真正的落地了,那才有真正具体的一些场景,那比如说像大家用的这个日常的这个美团也好,滴滴也好,对吧,每天的这个数据量呢,是非常的庞大的。
18:30
那么在这个十几年之前的时候呢,我们不会想到这样的一些业务场景的,那现在呢,每天啊,这个去年的时候啊,问一个这个滴滴的一个朋友说每天呢,他们光日志文件呢,就能产生这个40个T啊这呢都是很长之前的这个时间了,那现在的话呢,这个肯定是数据量更庞大。那为了能够应付越来越复杂的这个场景,对吧,那这时候呢,也需要呢,咱们不断的去优化咱们GM底层,那其中非常重要的就是JC,因为JC呢会影响咱们的一个性能,对吧?OK,那这呢,就需要我们做这样的一个,呃。
19:03
说明是吧,就是这次呢,要不断的去优化,那这个有点就像什么说你得攒钱啊,为什么非得攒钱呢,除了刚才说的这个角度之外呢,我们说你要不攒钱啊,这个社会呢,现在不断的变化啊,咱们经常老百姓说的叫钱就毛了啊,钱就不值钱了啊,实际上呢,就是通货膨胀,通货膨胀呢,导致我们这个货币呢,其实就贬值了,你要贬值的话呢,你要不攒钱,那迟早就饿死了,就现在呢,你一个月基本花4500,等以后的时候呢,钱不值钱了,一个月可能花6000,你才能够活下来,你要不攒点钱不就得死吗。有点像这个意思一样是吧,哎就这样个情况啊行,那这块呢,零零散散咱们就算聊啊,算是扯呀,诶把这几个概念呢说清楚了啊,这呢是咱们的第一个问题。
我来说两句