00:00
好,那接着呢,我们来看下一个新特性哈,这个新特性呢,是关于这个叫ZJC啊,其实也是提到我们这个垃圾回收器的问题,呃,所以大家会看到呢,基本上在每一个Java版本的更新,呃,Java更新的这个新特性当中,都会提到这个垃圾回收的问题哈,就关于这个性能提升方面啊,内存的这个优化方面呢,这是一个常谈常新的一个话题,这个CJC啊,首先呢,说一下它这个背景啊,是在我们JDK11当中引入的一个新的垃圾回收器啊,也是一个叫呃,这个什么可伸缩性的低延迟的一个垃圾回收器,这是一个实验性的啊experimental啊,实验性质的一个垃圾回收器啊,这个回收器呢,在我们这个JAVA13当中也做了一个更新啊,其实呢,它要不更新的话呢,基本上等于这个回收器可能就要被干掉了啊啊,因为我们这个12当中,大家看到引入这叫深度网是吧,深度网的话呢,它也是一个叫呃,低延迟的一个垃圾回收器是吧?低延迟的啊,就是我们这个低延迟的这个垃圾回收机的有这样特。
01:00
性的这个还不少呢啊,咱们这个CMS其实也是一个好,那我们这块看一下这个新特性想说明什么问题啊说呢,呃,GM的GC在释放,呃,这个JC以后释放的内存会还给操作系统吗?呃,这个咱们说之前呢是不会的啊,在咱们JAVA12当中其实提到过这个叫J1啊,是咱们讲的一个八的这个新特性提到过的,说这个G1的话呢,在增强以后,或者要改进以后的话呢,诶,当定期的垃圾回收之后,不再使用的对内存会还给操作系统啊,这是这一呢,在12当中做一个更新,而这个深豆啊呢,是在我们12当中引入的一个新的垃圾回收器,这个垃圾回收器呢,天然呢就具有这样的特性了。那这块提到了啊,12当中189,呃,关于它也是一个低延迟的一个垃圾回收器啊,实验性质的,呃,它呢,可以通过这样的一个参数去指定,在指定的这个时间之后呢,我们去做一个垃圾回收啊,进而呢,释放不再使用的堆内存给我们的操作系统。啊,在这12当中,这不是提到我们这个G1嘛啊,相当于呢,我们这个G1和深网呢,已经是可以实现啊,内存释放以后给操作系统归还不再使用的对内存了,那我们这个ZJC呢,在这样的一个场景下呢,它就也需要做一个改进啊,所以就我刚才说的那句话啊,如果这个ZJC在我们这个12版本中没出现过,在13类版本中,如果还不去对它进行更新,那这个ZJC呢,那基本上被干掉的可能性就很大了啊,因为呢,它本身呢,不再具备像我们这个改进以后的这个深GC和这个GGC这样的一些新特性了啊,那么它就相当于要被叫什么边缘化是吧,那就不再使用了,那我们可喜的是呢,是在这个实战当中看到了关于它的一个变化,所以这个事儿呢,其实新特性我们讲起来就比较简单啊,就相当于是让我们的JJC也具有了在垃圾回收这个执行完以后啊,归还未使用的堆内存给操作系统这样的一个特性啊,仅此而已。
02:58
啊,下边呢,关于我们这个ZJC呢,呃,就是再多描述几句啊,我们看一看这个CJC在实际当中引入的说呢,它也号称能够保证在十秒以内呢,释放这个GM,而且呢,不管我们开了多大的这个堆内存,呃,在这方面呢,其实跟我们说的这个深度啊,这个GC呢是比较像的啊。
03:16
OK,这个就不多说了,那下边呢,我们来嗯再回顾一下啊,说为什么我们要考虑把不再使用的这个堆内存还给操作系统啊,这呢,我们在讲这个12的时候呢,其实也提过这个问题啊,我们再回顾一下,有这样的三个这个场景,第一个呢,就是按需付费的容器环境啊,按需付费嘛,那我们实际上呢,用不到这样的大的空间,那你还付了这么多钱,其实没有必要,那么对于这个,呃,比如说云服务器的这个厂商来讲的话呢,你这块空闲呢,其实呃有点浪费,你还不如把这个硬件资源呢,贡献给其他人去使用,虽然说你付费了对吧?呃对于你来讲的话,你不就浪费钱了嘛,呃第二的话呢,就是应用程序呢,可能存在长时间的一个闲置,呃,并且呢,和很多其他应用程序呢,呃,共享和竞争资源的一个环境,那你这块闲置呢,别人这块呢缺少,呃,你不如呢贡献出来给别人用是吧,让操作系统呢,去动态呢,进行一个这个调度啊,然后第三个呢,就是应用程序呢,在执行期间有非常不同的堆空间的需求啊,很多时候呢,我们在启动啊。
04:16
这个程序的时候呢,花送花费的这个内存空间要大一些,那么稳定运行以后呢,这个内存空间其实就使用的比较少了,那么在稳定运行的时候呢,我们就没有必要再占用过多的这个内存空间啊,基于这样的一个情况呢,我们就有必要在垃圾回收的时候啊,归还不再使用的堆内存给操作系统啊,那么具体我们该怎么去实现,这就是关于这些细节描述了啊,这个大家呢也了解一下,那首先这个ZJC它呢,也是把我们这个堆空间呢,分成若干的region啊,跟咱们这个G1或者叫g first是一样的啊,堆空间呢,我们从逻辑上呢,是这个连续的啊呃,当然呃这个实际上我们在呃使用的时候呢,都把它分成一个一个的这个不连续的region了啊,是这样个情况,那么每一个region呢,我们称作叫Z配置啊,称作Z配置,那我们在进行这个垃圾回收的时候呢,我们这个C配置,这个这个不再使用的这个内存,这个region呢,我们就会去释放啊,这个释放的话呢,我们需要把这个C配置就是。
05:17
相当于我们每一个不再使用的这个region啊,会把它呢,呃相当于是存储在这个叫配置catch当中啊,配置catch当中,或者我们叫Z配catch就可以,那么从这个配置catch当中呢,我们去这个呃这个把这些不再使用的这个Z配置呢,做一个呃叫什么释放啊,然后把这部分内存呢,还原个我们的操作系统,那么在我们这个配置catch当中,这个不再使用的Z配置,它是按照这个LRU这样一个算法呢进行保存的啊LRU呢就是叫last recent use啊list啊recent就最近的最少使用啊,也就说呢,我们这个最近如果你使用的这个内存,那我也认为呢,你未来呢,也会以比较高的概率呢去被使用,那最近如果你要是没有用,那我就认为呢,你就是一个垃圾了啊,属于这样的一个算法啊,啊在内存不足的时候呢,我们可以清除最近啊,最少使用的这样的一些内存空间啊这呢是解决了一个算法回收的问题,那么下一个问题就是说我们什么时间需要呢,从这个。
06:17
呃,配置catch当中去清除不再使用的这个Z配置呢。啊,什么时候做一个清除呢?啊下边呢,就有一些参考,这个参考的话呢,其实大家呢,在听完这个12当中,我们讲的这个改进的这以后呢,其实你也有所这个叫什么思路了啊,咱们讲这个J1的时候啊,G1的时候呢,其实我们提到过一个这样的问题,就是。嗯,在这里提到这样的一个参数是吧,就是我们在指定这个参数啊,上一次垃圾回收之后啊,我们指定这样一个参数啊,指定一个毫秒数的这个时间,超过这个时间的时候,如果你此时呢,没有进行垃圾回收,那我们呢,就定期的进行垃圾回收了,哎,或者呢,我们通过这样的一个临界值啊,它指定就是我们呃调这个G啊,呃调这个定期的for jc啊还是说执行这个叫并发的呃垃圾清理是吧。
07:05
呃,这是我们这个G1当中提到的那么深度啊,这个J些的话呢,呃,设置一个叫UN commit delay啊,也有一个毫秒数啊,在这个毫秒数的到达的这个时间的时候呢,也会自动的进行一个垃圾的一个回收,哎,释放不再使用的这个内存空间啊给操作系统就是他俩呢,其实这个处理策略呢,有点相似,当然这个J1呢,就会更复杂一些啊,那我们这个CJC怎么做呢?它其实完全可以参照啊,咱们刚才提到的G1或者是深JC这样的一个策略,在指定的这个时间之后呢,我们定期的进行垃圾回收啊,所以这块呢,看提到一个参数可以这样去做,呃,但是呢,我们这时候用户呢,还想设计的更复杂一些,说不需要呢,添加任何新的命令行的选项啊,就希望呢,能够实现一个呃,归还不再使用的对内存空间,那怎么做呢?这个目前呢,我们现在还看不到官方提供的任何这个策略啊,这个未来的话呢,就会提供这样的一些方式了,那目前我们能想到的就是设置这样的一个,呃,指定的一个参数啊,在这个参数这个到达这个时间的时候呢,进行垃圾回收啊归还。
08:06
传啊on commit的这样的一个内存空间啊,属于这样啊,嗯,再接着我们提到一个事呢,就是这个UN commit呢,呃,默认情况呢是开启的,哎默认情况下是开启的,但是呢,如果我们指定这个堆空间的时候啊,叉S呢,我们指定的是最小的一个堆,那就是初始的一个堆内存空间,如果这个内存空间跟我们这个呃叉M叉MX啊就最大的一个堆内存空间,如果这俩数是一样的话呢,会比较麻烦,为什么呢?因为我们这个ZJC啊,它归还堆内存的时候呢,呃,比如说我们一开始指定的是啊这个十兆啊举个例子,呃,十兆,那么这个ZJC我们再去释放不再使用的堆内存给操作系统,也不会说把这个呃堆空间降到十兆以下,就是不会低于我们这个XS啊,那如果我们这个XX跟XX呢,用的是同一个值,那其实就意味着我们这个就失效了哈,因为呢,你不可能再去归还内存了。
09:02
啊,这是这样个行为,所以大家在实际使用当中呢,你要注意我们这个叉MX跟我们这个XX初始内存和最大的对内存这个设置的值呢,你就不能一样了是吧,这是一个啊另外呢,我们还可以通过直接设置这个参数的方式呢,去让他呃撤销啊这个新特性是吧,撤销我们呃归还不再使用的对内存这样的一个行为。行,这呢就是关于我们这个ZJC的一个说明啊,大家呢,总结起来啊,就一句话就是ZJC在我们JAVA13当中也具备了和改进以后的这一相同的特点,或者说跟我们一开始声明的这个深度啊,这些相同特点就是呃,在定期垃圾回收之后啊,归还不再使用的对内存空间给操作系统啊,方便操作系统再进行内存的一个及时分配调度啊,是这样一个情况。
我来说两句