00:00
好,那么同学们,我们下面来看一下G1的底层原理,那么首先一定要明白这个东西哈,观念上要根本转变,一下子我们从功能型手机诺基亚这三个过渡到了智能手机,苹果,安卓,华为,小米。那么所以说。要明白一个东东,叫range,区域化的垃圾收集器,就叫机器收集器,一句话,最大的好处,化整为零,避免了什么全内存扫描,只需要按照区域来进行扫描就行了。那么言下之意是不是打扫的?范围变小了,这么小块小块好,那么这个时候我们来看。首先那么这个G1它是什么概念呢?区域化内存画片运检,那么整体变为一些不连续的内存块,避免了全内存的GC操作干嘛?是不是避免了全内存,所以说它收集快。
01:00
核心思想,整个堆内存区分成大小什么相同的子区域,那么GVM启动的时候会自动设置子区域的大小。在堆的使用上面,并不要求对象的存储一定是物理上连续的,只要逻辑上连续即可,它的整体就是记一,然后是一个围棋的棋盘,每个区域有可能是伊甸园区,这个有个区域是什么,幸存者区,那么OK,那么呢,他们的每个分区也不会固定的为某个大服务,他们是会变化当中的,就像一个孩子啊,他会慢慢的长大,然后呢,会有各种变化,各种造型。可以根据需要在年轻带和养老袋之间切换上一次啊,比方说左边这个是年轻带,下一次啊,它可能变成养老袋了,是这么个意思,它会变化啊。那么启动的时候,我们可以拿这个那个每一个区域的堆内存,就相当于说把整个堆内存就划分成了一个大小的一块一块大小相同的子七件,那么呢,一到32兆必须是二的。
02:01
密默认将整个堆划分为2048个分区,那么大小范围在一到32兆,最多能设置这么2048个,什么意思啊?也就是说我最大能够支持最大内存是32。一个块最多是2048个分区多少64G内存,那么坦白讲,你现在同学们,你们目前班上我知道的最高是不是也差到个16G32G,很少有同学物理内存占到64个G,多了他也吃不消了,坦白讲你什么程序64G啊,要写的64G对吧?高清电影什么的都可以加载进去了。好,那么接下来我们来看一下。来,同学们积极将新生要它的物理空间划分取消,什么意思啊?Forget it,那么言下之间不再像以前的一,从左到右就像一条相肠一样,以前养老区特别大,我们讲过新生区占1/3,养老区占2/3,我讲那个时候杨哥还跟大家讲过,我默认对内存多少,是不是默认是四个G,你试试要扫描四个G和你现在只需要最大是32兆扫描这么一个块,哪个块啊,哪个块对吧?那么所以说没有以前的了,那么现在我们呢,记一的算法将整个堆划分成若干,以前叫切香肠,现在叫什么百围棋,这么说能跟上好。
03:24
那么现在呢?我们搂一眼他干了一件什么事呢,兄弟们?第一个,那么每一个区域块,灰色的没有用的,伊甸园S0区O的区,还有这个什么超大对象区能理解,那有些时候哈,我们原来讲过,如果一个对象特别特别大,我们就尽量不要让他诞生在伊甸园区,让他直接去养老区,那么一样,由于你这个对象我每一小块只是32兆,如果这个对象你特别大呢,又是60兆呢,超过了一块区域呢,那么记一非常聪明。他就会针对大对象,专门在把干嘛合纵连横,铁索连横,把三个块连起来,保证32 32 32,我反正有2048个区块,最大64个G,你怎么着也能够转,那么言下之意,这个红色的代表是转的是什么大对象,那么E代表的什么?伊甸园区,S就是代表我们的survive区,幸存区,蓝色O的区,那么来他是怎么干呢?
04:28
首先我们可以看。分成若干个区域块了,仍然属于分带收集,那么是不是也还是在什么这个里面,整体上倒是不再像这样分伊甸园区,幸存区和养老区,但是细节上,微观上它是分遗,你看这小块叫伊甸园区这小块,幸存这小块old区,那么这些园区一部分包含新生代,那么新生代仍然是采用暂停所有应用线程的方式啊,然后将活的对象拷贝到老年代,跟以前一样,比方说这块。呃,新生的对象分在这块,一定园区零零要上来了,咔嚓停下来,这小块干嘛?它不是整体停就停这块,然后呢,采用暂停所有应用程序的方式啊,将存活的对象拷贝到什么老年代或者是我们的幸存期,然后这些干嘛?Range积呢,一部分就包含了老年代,那么积极收集器将通过从对象同一个区域复到另外一个区域完成清理工作,这就意味着在正常处理过程中干嘛?比方说就这么一小块,你走了,该死的死了,然后该升级的生成养老区,该拷贝的拷贝到这,那么言下之意,这块是不是空了?那么这块干嘛完成了堆的压缩。
05:38
这样就不会有c mouse碎片产生的问题,也就是说32兆吧,就清理这一小块很快就完成了,也就是说边复制拷贝边清理好。那么接下来。那么刚才我们说过了,这种呢是大对象,那么它专门呢,就是呃基划分了一个句对句型对象的一个,因为有些巨型的对象默认会被分配在老年代,但是呢,它是个短期存在的,那么呢就会哎呀给我们呢,就好比说大家都是正常的行李旧,你带的东西多旧,你带的东西超规了,我们是不是要走另外一种超规行李托运通道。
06:17
那么这个时候它就是专门用来存放这些超规行李的托运通道的,如果一个H区装不下,那么他会找什么连续的H区来方便存储,那么如果我有时候为了能找到连续的,那么他就会,哎,你们几个都搬一下吧,就比方说那各位那个顾客你们好,你看我们突然来了八个人,你们你们能不能换一下桌子,你们用小桌子,我们想给这八个人三张桌子拼起来,OK,那么餐厅用饭也见过这样拼桌,那么这个就是给大对象,那么所以说对于鸡一一定要明白他。变成了四种情况,伊甸园区,幸存区、养老区和大对象区,好,那么这个就是我们的什么G1的一个区域化垃圾收集器的介绍。
07:02
那么接下来我们继续,然后呢,来看一下它的回收步骤,那么怎么来回收的呢?那么来同学们记忆收集器。他们。比方说我们伊甸园区产生了一个样机实验,它的过程是这样的。针对伊甸园区进行收集,伊甸园区那个被耗尽了,也是达到了一定的巅峰值警戒值,开始回收,主要是小区域收集,也就是这样的收集家要形成连续的内存块,避免内存碎片。再次强调,第一,没有内存碎片了,用官方的话来说哈,但实际上我猜着可能或多或少还是有一点,因为Java太复杂了,他有时候都不一定能够100%绝对的事情啊,收集干净,但是几乎可以是。忽略中内存碎片,那么伊甸园区的数据会移动到区。那么大家请看。现在我们这一点园区一甸园区一甸园区,诶有没有发现这个棋盘这些格子在变动了,那么假如说幸存区也不够了,一定园区就会晋升到O的区,那么大家可以来看一下,那么survive区是引到新的survive区什么概念,那我要给你,那我也还不够呢,怎么办?那干脆这样吧。
08:16
123这块以前是没人要,现在变成什么新的幸存区,123我们都移过来。然后最后一定园区收拾干净,机器结束,用户的应用程序继续执行,那么来,同学们请看一眼。干嘛?我们刚才讲过,这哥们是不是本身就是个幸存区,然后这两个是一定园区收空了以后,我们三个全部合在这,那么来同学们请看。从这到这没了吧,那么这块一定园区干嘛搬过去,那么剩下的没有回收完的继续用,那么再来看这。幸存区一定区一定区,注意穿穿穿过来,那么OK,这形成新的幸存区,你看这个角色是不是变了,你看再看幸存区以前在这儿,现在变成什么。
09:07
空的了,那么我们呢就可以。明白,他这个东东如果是幸存区,还能够直接晋升到养老区,那么他这个东东是不是在小范围之间来进行收集处理和移动,好处是什么?大家有没有发现以前这块不连续,大家有没有发现现在这块怎么着,是不是开始慢慢的变得连续了,它这样就解决了内存碎片的问题。永远记着小区域范围内的收集。加形成连续的内存块,那么这块小区域的收集加形成了连续的内存块,好,那么这个就是我们的什么回收步骤,那么它的。回收呢也分四步,那么大家搂眼分别是这样,记忆收集器有点跟我们帽类似,也是初始标记,然后呢,这个要停一下。
10:05
然后呢并发标记,然后呢最终标记,然后呢筛选回收,也是跟MOS一样,这么四步过程。好,那么呢,这个就是我们记忆的底层收集情况。
我来说两句