00:00
好,那下面呢,咱们来谈一谈这个我们创建了一个对象是吧,你有了个对象之后呢,在这个堆空间当中,具体的哎,这个对象呢,是如何分配空间的啊,因为呢,前面我们已经说到这个新生代,哎说到这个老年代啊,新生代里边呢,又细分出来,我们说很细节的这个内容是吧?哎,分成这个叫伊甸园区新增社零区,新增者一区,到底该怎么去使用这样几个区域,哎这呢是我们下边呢要讲的这个问题。好,那么首先呢,来看一下这个PPT啊,PPT这块呢,我把这个过程呢也描述出来了啊,12345678这样八个步骤啊,那首先我们来看一下啊,说呢为新对象分配内存啊,是一件非常严谨和复杂的任务,这个复杂呢,主要是因为我们这儿呢,给对空间是不是不是一块,而是分成了好几部分是吧?诶所以呢,整个过程呢,就会显得比较复杂一些,那同时呢,也是非常严谨的啊,不能说呃想当然啊,这是不可以的,那么GM的这个设计者们不仅需要考虑内存是如何分配的。
01:00
哎,在哪里分配的问题,而且呢,还需要考虑啊,由于呢,呃,内存分配的算法与垃圾回收算法呢,是密切相关的,所以呢,还需要考虑这个GC的问题。啊这呢就是我们要说的这个情况啊,就是呃,我们现在呢,讲这个内存的分配啊,跟这个GC啊,实际上我们就结合着一起来讲一讲,当然这个GC呢,我们还不会说那么细致啊,只是呢,诶讲我们需要呢,用到的这个JCOK,好,那这块呢,我们就不看这个具体的描述了啊咱们直接呢来带着大家呢看这个图,这儿呢,我画了一个图,通过这个图呢,咱们来进行一个说明。好,那咱们就开始首先说呢,我们说这个堆空间呢,是分成了,呃,我们这样说吧,四个部分是吧,新生代里边有伊甸园区,新盛零区,新一区,以及呢,还有一个老年代啊,我们称呢叫old generation或者叫ten generation啊,就是老年代或者叫养老贷啊都可以。那从这看呢,就是四个区域,那当我们来对象以后啊,首先呢,把这个对象,诶我们考虑呢,是把它分配在叫伊甸园区,就跟说亚当夏娃一样,是不是一来的话呢,就先在这个伊甸园区是吧?好,那伊甸园区呢,我们就开始放这个对象,大家脑子里边呢,可以浮现个场景,比如呢,这就是个篮球场,这个篮球场里边呢,我们这个每一个人呢,就是一个对象,哎可以往往往这个篮球场里边呢,去去去站是吧,站到篮球场上,哎,空间很大,对象呢相对来讲小一些。
02:26
啊,就一个一往里放好,那我们放着放着放着放着是不是有可能就把我们这个一电源器呢,就要放满了呀,行,那么一旦我们这个一电源区在放满的时候,我们再来对象伊甸园区已经放不下了,这个时候注意,这个时候呢,我们要开始进行一个垃圾回收。啊,这个JC就是呃,就是我们说的这个garbage collection是吧,垃圾回收,那么这个JC啊,咱们给大家起个名字叫做young jc,就我这里边这个Y啊就是young j c,就是年轻代的一个垃圾回收啊,也可以称为呢叫mini j c,一个意思啊,一个意思,注意我这里呢强调的这个MGC呢,是说当我们这个呃这个叫伊甸元曲满的时候呢,我们触发的这个叫做GC啊mini GC或者叫young GC,那么EGC的时候,我们其实呢,会有一个过程,这个咱们后边会讲啊叫STSTW,就stop the word就此时呢,用户线上呢就停止了,诶我们呢,开始要判断一下,比如说当前我这个医疗园区呢,是放了五个对象,这五个对象呢,我们要判断谁是垃圾谁不是垃圾呢。
03:32
对吧,诶谁是垃圾谁不是垃圾,那这呢怎么进行判断,这个是咱们后边呢要讲的这个内容啊,涉及到了一个叫引用技术算法,一个呢叫可达性分析算法,在咱们Java中呢,咱用的叫可达性分析算法了。好,那个咱们后话再说啊,就大家呢,先知道这一点,当我们通过这个mini jc之后呢,咱们就能够判断出来哪些数据还哪些对象呢,还不是垃圾,哪些已经是垃圾了,那这里边这个红色的那表示呢,就是已经是垃圾了,就是没有任何引用的指向他们了,咱们也不再去使用这个红色的区域了,所以呢,在我们经过一次mini j c以后呢,诶这个红色的呢,就被干掉了,就被清理掉了,空间呢就释放了,那么绿色的这两个呢,还在被占用,那就是说还要被使用,那我们呢,就要把它俩,诶是这个提升到哪呢,我们的幸存者去。
04:23
就听到幸存者区,那此时的幸存者区S1S2呢NS0S1呢都是空的,我们呢,就先把它放在S0这个区域里边。啊,放在这里边,放在这里边以后呢,大家看到我这有个一是吧,诶我们为每一个对象呢,分配了一个叫年龄计数器。Age啊,年龄计数器从这个伊甸园区过来的,放到新热区的时候呢,我们此时呢,把他们这个age呢复制为一,所以这两个对象呢,都是一。可以了是吧,那接下来的话,大家就发现我们这个伊甸园区呢,是不是数据就完全清空了吧,就没有数据了,就只有我们这个新增者领区里边有两个对象,好,那么接下来的话呢,我们再在咱们这个伊甸园区呢,去存放对象啊,一个个往里放,放放放放放放,那么不断的放的过程当中,是不是我们这个伊甸园区又满了呀。
05:13
对吧,诶右满了,那右满的时候呢,照样的触发咱们这叫mini j c或者叫young j c,那此时的话呢,我们发现这四个对象呢,是这个垃圾,所以我们就回收掉了,那这个绿色的话呢,还需要使用,还需要使用呢,我们就要给它晋升到咱们的幸存者区,那此时要注意,此时呢,我们这个对象还要被使用,是放在S0还是放在S1呢,这时候一定要注意,咱们要把它放在S1当中。哎,要把它放在S1当中。啊,放这儿是吧,就是放到了我们这两个里边那个空的空间当中啊,空的这个空间当中,所以呢,咱们这块前面也稍微提到过,关于性质的零区和一区啊,咱们还有个名字是不是一个叫做from区啊,一个呢叫做to区是吧?有的时候大家看一些帖子或一些书当中,我们在讲这个对象,具体的这个分配的过程的细节当中,我们通常呢,就讲from和to了,我这为什么没写呢?因为from和to啊,他俩这个关系呢,是不确定的,比如说咱们刚才呢,执行完一次这个操作之后呢,你看这个S1是不是一个空的呀,那么接下来呢,我们把这个呢,就称为是个to空间,To就是空的意思是吧,那么接下来呢,当我们第二次这个GC的时候呢,咱们把这个还被占用的这个对象啊,咱就放到这个诶空的这个two空间里边,所以我就放到这了,那自然而然的它这个是不是A就是一是吧,那么当我们进行这一次叫啊这个样JC的时候呢,我们S0的这两个对象呢,也要进行一个判断看看呢,你这哥俩还需要被使用吗?
06:44
一判断发现,哎哟,你俩还被占用,就是还不能销毁,那么此时呢,这两个在S0区的对象呢,也把它们放在S1区,那他俩的A呢,就自动的去增长,变成了二。哎,就是这样一个过程。哎,注意就是这样一个过程,好,那么这个过程执行完以后呢,我们发现S0区是不是这个数据就没有了,伊甸园区是不是也没有了,那么此时呢,咱们把这个S0呢,再称为是一个兔区。
07:10
那它呢,一就变成了叫from区了。言外之意呢,就是每次咱们执行完这个GC之后呢,是不是谁空谁是突啊。这个空了,这它它就是to,这个to呢,就代表着我们下一次GC的时候,让JC的时候呢,伊甸元区的对象呢,要往哪放,就是伊甸元区的对象永远是不是先往这个兔区里边放啊,因为它是空的对吧?哎这个道理。好,那么接下来呢,咱们一边园区呢,接着去放对象,接着放数据,然后呢,再放的话呢,就该往我们这个这个S0里边放了,就是我们刚才说的它就变成to了,然后呢,我们顺便呢,再判断一下,S1这里边呢,这三个对象他们呢,是不是还被占用,那也有可能这个S2呢,已经不再被使用了,它那就变成个垃圾,那就被回收掉了,那么这两个如果还被占用呢,这两个是不是就接着往我们这个S0这块去放呀。
08:02
哎,一四这样一个过程,不断的去累进啊提升好,那么走着走着走着,哎,那么接下来呢,我们就说到一个相对来说是一个特殊的情况了。什么特殊情况呢?当我们这个一定园区的这个对象,咱们这个右满了的时候呢,他又要执行这个叫young j c,或者叫这个mini j c,此时的话呢,只有一个对象要放,放到这里边了,咱放到这儿了,就是它目前还是个凸空间啊,就空的放到这儿,OK,然后呢,其他这些都是垃圾,就被回收掉了,那S1里边呢,我们经过这个YJC的时候,也要判断一下它里边这个数据,看看它哪些还有用,结果呢,发现这里边这个1A是一的,还有用,那我们就把它放在这个去,那么这两个值大家注意,这是咱们所谓的这种叫特殊情况,我们此时这两个对象呢,它俩的A值年龄期数期呢,已经达到15了。达到15了,那达到15的时候呢,我们就要把这两个对象啊,给它们做一个晋升,叫promotion晋升的意思。
09:01
嗯,晋升晋升到哪儿呢?晋升到老年代。那那进入到老年代就放到这儿了,他们其实呢,就是相当于这个A值的值是16了,只不过后来呢,咱们就不再去考虑这个值了,这个值呢,只是在就是咱们说的这个年龄计数器,这个A只是在咱们判断呢,什么时候从幸存者区这个晋升到咱们这个老年代的时候呢,咱们才会用到这个年龄计数器,哎,这个大家注意,这叫promotion,就是晋升啊,这个大家注意一下这个词这个叫法,那么这里边这个15啊,我们称为叫阈值。阈值就是临界值呗,是吧,哎,我们叫阈值,那么这个值,注意我这15呢,不是凭空写的,它是一个默认的情况,这个值呢,咱们也可以去修改,那修改的话呢,这我写了这个参数叫max turnureing,这个threhold thhold,就临界值的意思,这个呃,Turn turn new是吧,Turn newd,这个是我们老年代的意思啊,就是最大的一个晋升到老年代的一个这个临界值,哎,这个值呢,我们默认情况下呢,是15。
10:00
当然呢,也可以用我们上一章当中讲的那个指令是不,你可以看一看这个指是不是15是吧?哎,我这就不演示了啊行,那这呢,就是我们说清楚了,就是它的一个晋升的一个标准。哎,看这是吧,那今天这个标准就是15。行,那基本上咱们把这个过程呢,就是最标准的一个过程,咱们就算是说清楚了。哎,就算说清楚了啊,那么就相当于是咱们举个生活中的例子,有点像什么呢?就是咱们举部队的吧,部队的话呢,像这儿呢,都是新兵,只要是新兵的话呢,是不是都进我们这个叫一地园区。然后呢,这个新兵,这个经过一国筛选,比如说我们要选拔一个几个人是当这个特种兵对吧?那知道呢,特种兵呢,筛选的这个条件是非常严格的,那很多人呢,这个不符合就被淘汰了,就好比是我们这里边呢,判断完这个JC之后呢,它不再被引用了,他就被回收掉了啊,就相当于被淘汰了,那么这里边儿呢,我们如果他还是满足这个你是一个特种兵的条件呢,是不是就接着晋升是吧,这时候这个年龄呢,就变成一了啊,一变成二,二变成三,一直不断的去晋升,有点像呢,这个一个普通的兵是吧。
11:07
当了一个,嗯,排长,排长呢也当成连长,连长呢当成这个营长,营长当成团长。啊,然后等等等等一直往上晋升啊,那晋升到这个过了15的时候呢,到老年代的话呢,心里边儿可以喘口气了啊,因为这时候呢,我们再被回收这个对象的可能性呢,就非常小了。就非常小了。嗯,这是我们说的举的一个生活中的例子,那其次的话呢,还需要给大家强调一个点,就是我们这里边儿这个样JC什么时候触发的它呢。什么时候触发的他呢?是不是就当我们这个伊甸园区满的时候,咱们开始触发这个央JC。没问题对吧,那有同学可能会想说,我们这个呃,Survivor区,咱们是不是讲了一个默认的一个比例,是不是叫8:1:1啊。YG呢,就是咱们这个survivor区的话呢,这个空间是比较小的,那么当我们这个伊甸园去满的时候呢,触发样这些,那万一要是幸存者去满的时候呢,会触发吗?
12:05
这个时候注意。不会处罚。一定要注意啊,如果面试的时候问到你好,那什么时候会触发央类C呢?你说啊一定要去买的时候,那要问说取二维码的话呢,会触发吗?大家注意不会触发。也就是说,呃,当然注意啊,不会触发不意味着咱们这个呃星特的区它不会存在垃圾回收,这是两回事啊,就是当我们这个伊甸园区满的时候呢,咱们触发样JC或者叫mini j c的时候呢,会将我们的伊甸园区和幸存者区一起进行回收。就这也会回收,就是他那属于一个被动的回收,是因为人家这个伊甸园区满的时候被触发的,然后他才跟着被回收了。啊,就是这样子的,那这块满的时候怎么办呀,这块满的时候呢,那就主要看我们新生代往这块放的时候,他要满了,这块又涉及到一些特殊的规则,这就是咱们接下来呢,要给大家讲这个问题啊,就是你这块要满了,我们可以直接呢,让他晋升到这个老年代,也就是说就跟当兵的时候有一些特殊情况,特殊情况呢,比如说正常人呢,这个先到这个连排长,排长到连长,连长当这个,呃。
13:14
营长是吧,他营长到到团长等等一点点往上升,是不是也有一些呢,因为特殊贡献这个拯救了这个什么整个部队是吧,在战争这个场景当中,他直接呢,是不是有一个排长上来就直接奔到这个,呃,团长去了。当然这个实际情况呢,可能非常少是吧,在一些极端情况下呢,我们可以跨级让他去晋升,你可以这样来理解。啊,那就好比是我们这个,如果是幸存者区,在没有达到这个食物的时候呢,有没有可能性直接被进入到这个老年代呢?是有可能的。诶,这就是咱们下边给大家讲的这个问题啊,这大家注意好,那么诶顺带呢,再说个问题,有同学会想真的有没有可能性说这个哥们儿一上来他就不在新这个伊甸园区,上来就直接奔到这个老年代那。
14:00
哎,这呢,也是有可能的是吧,也是有可能的,就跟咱说上来呢,有的人哎,一出生啊,就是极其聪明啊,就跟咱们说动画片里边就一出生不是像孙悟空一样得一点点去成长啊,上来就是超级赛亚人。对吧,啊,那甚至有些国家的这个一些这个职位,他不是说呢,从老百姓你这块一点点呢晋升上去的,而是呢,世袭是吧,啊,一出生就含着金钥匙,一出生就是国家的王储,一出生就是这个,呃,部队的总司令的候选人是吧,就是有可能一上来就是到老年代也是有可能的。哎,这个大家注意一下啊行,这呢是我们说了一下这个图,这个呢,说清楚以后,那我们这个过程呢就清楚了。哎,大家呢,去体会一下啊,那如果面试当中问到,那你能够把这个过程呢,基本上描述清楚,就按照我刚才说的这样一个图,这是其一,其二的话呢,就是即使面试不问,大家呢也要清楚这样一个过程,因为这里边儿除了蕴含我们的GC之外呢,还有咱们后边要讲的相关的垃圾回收的算法。
15:00
包括呢,这里边S0SSE呢,它俩是1:1的,就是我们这里边是不是用的叫复制的算法呀,那为什么要用复制算法呀,主要是为了解决我们这个这个碎片化的问题是吧?诶这些呢,在我们诶下边这个章节当中去讲到咱们说的这个垃圾回收算法的时候啊,咱们还是要涉及到这些点的,也就是说咱们要讲的这个知识点,其实它都是相通的啊,诶咱们只不过现在呢,主要重心呢,讲的是对象的一个分配,在这个过程当中讲到了这个GC。好,那么关于这里边儿呢,总结两句话,这两句话呢非常的重要,大家记住它第一个关于幸存者零区和一区,我们总结的内容呢,叫复制之后有交换,谁空谁是兔。能理解吧?啊,其实这些话的话呢,这不是我总结的啊,这个是咱们这个大家呢,在学习这个对象分配的时候呢,非常经典的被前人总结出来的话,嗯,我们这里边儿啊,每次执行完以后,这个兔区它一定是空的。谁空的谁就是兔对吧,然后这呢,我们用的是叫复制算法,所以呢,就是复制之后有交换啊,谁空谁是to,体会一下,再一个这呢是我们一个经验。
16:08
是我们的一个经验说呢,咱们在进行垃圾回收的时候呢,会频繁这个收集新生贷较少,收集养老贷几乎不动,永久贷或者叫远空间。真的是咱们这个方法区的两种不同的不同的版本当中的一个升级是吧,哎,这个咱们下一章呢,重点讲这个方法去,大家能不能去体会这个问题。其实在刚才呢,我们讲解过程当中呢,也给大家渗透了这个问题,我们一来对象优先考虑在伊甸园区进行分配,那对象呢先都来这儿,然后这块呢一回收,然后我们再往这放。啊,这里边儿我们还要注意一个问题,就咱们之前也提到过,就是通过这个统计分析哈,80%左右的这个对象,它呢,都是在这个新生代过程当中就被销毁掉了,也就是我们所说的叫朝生夕死。哎,朝生夕死,就是说绝大部分这个对象呢,当我们进行这个样GC的时候呢,绝大部分都已经死掉了,只有很少的一部分呢,我们会晋升到这个survivor区,所以呢叫做幸存者。
17:08
对吧,那么每次来对象我们都优先考虑在这个伊甸园区呢进行分配,所以说呢,伊甸园区这块呢,包括呢,我们S0S1这块呢,收集起来呢,是比较频繁的,频率非常高,那么当它达到15的时候呢,你想想15次在GC的时候呢,它都没有被回收过,我们把它进入到老年代,那么我们就认为啊,它的生命周期是相对来讲比较长的,而且呢,老年代咱们说正常情况下呢,咱们新生代呢比例是一,老年代呢,是不是比例是二啊。哎,本来呢,都经过久经考验了,都是革命的老战士了,忠心耿耿是吧?轻易呢,我们就不动它了。另外的话呢,这个老年代空间啊,是不是也足够大,那空间呢,足够大,咱们是不是就不会再去试图去触发这个老年代的GCR,所以说呢,我们这个老年代,呃,相对来说这个回收的频率呢,要低很多。来指导年代来讲啊,那对于这个方法区域,我们讲的永久带也好,这个原空间也好啊,那么我们更少的去动它们啊,它都是我们加载的一些类的情况了,哎,更很少的去回收。
18:12
所以呢,这就是我们说到这个频繁收集新生贷,较少收集养老贷,几乎不动永久贷或者叫空间。啊,这个呢,大家记住它。好,我们填一下。
我来说两句