00:00
好,接着我们来看第八个新特性,叫增强的G1啊,相当于对G1呢又进行了一个改进,使它呢能够自动返还未使用的对内存给操作系统。啊,这个呢,就是这个名字呢,已经描述的是比较清楚的哈,呃,就相当于是我们对这个G的垃圾回收器呢,回收器呢进行了一个改进,希望呢,他能够在空闲的时候呢,将不再使用的堆内存及时的返还给我们的操作系统。啊,是这样子的哈,这呢属于一个重大的一个改进,那么在目前的JAVA11或者之前的版本当中,我们这一的垃圾回收器,它是不能够及时的将这个已提交的对内存呢返还给操作系统的,为什么呢?因为我们只有在执行forc或者呢con cover circle啊并发处理的时候,才会将我们不再使用的内存归还给操作系统,但是呢,由于这两个场景都是我们这些呢极力避免的。啊,因为像for这些的话,我们这个暂停时间会稍微长一些啊,嗯,那因为呢,你是极力避免的,所以说在大多数场景下,我们都不会及时的去归还未使用的堆内存给操作系统,除非呢,我们有外部的强制执行啊,强制的我们去调用它的for GC啊,进行一个垃圾的回收啊才可以啊呃,那么相应的一些弊端是什么呢?在这儿举个例子啊,就是云平台的容器当中。
01:13
那用户的话呢,都是根据他实际使用的资源进行一个付费啊,这个付费,然后呢,获取相应的这个内存资源,那一旦呢,如果发现用户呢,付费以后,他的这个内存使用呢,其实没有那么高,那按说的话,这个时候其实可以把相应的一些硬件资源呢,贡献出来,这个给其他的一些用户去使用的,也就是说呢,我们对于云服务商来讲,提供商来讲,他没有充分的去利用他的这个硬件资源。啊,那如果说呢,我们在此期间这个虚拟机能够检测到Java堆内存的一个使用,实际的一个使用情况,并且呢,能够利用这个空闲的时间呢,自动的归还障va内存给我们的这个,呃,这个操作系统的话呢,其实对两者来说来说呢,都是有好处的,那对于用户来讲呢,它不用去过多的付费,那对于这个呃硬件来说呢,也能够充分的对它进行一个使用。
02:04
诶是这样个情况啊,嗯,你要说生活中的例子呢,就好比是呃稀有的资源,就比如说这个车位,嗯,在城市当中呢,尤其像北京上海等等这些大城市里边,还就像北京首都也称为叫首堵是吧,这个车位呢,其实非常的紧张啊,这个车位呢,其实就相当于是我们的这个内存资源一样,如果有的人买了这个车位以后呢,他其实并没有车啊,那这时候呢,这个车位的资源呢,其实就浪费了,那不如呢,他把这个资源呢贡献出来,让别人有车的人呢去使用,那有的人有车,但是他没有车位,那属于这样个情况,那我们就希望呢,能够,呃,当你不用这个车位的时候呢,及时的贡献出来,让让别人去使用,能够达到一个资源的更有利的一个分配。啊,那如果是农村的话呢,呃,就好比是咱们这个,呃,像这个这个革命当中哈,呃都涉及到各种的这个土地的土地制度是吧?呃比如说这个改革开放的时候呢,也提到叫分田到户啊,就是根据你每家每户的这个人的多少,我们分配你相应的这个,呃几亩地或者几分地啊属于这样情况,那么如果说给你分配了这个相应的比如说一亩地,但是呢,你实际上你家根本就不种这些地是吧,都去这个这个城市里边打工了,去工厂了,这地呢就在这荒着,那其实就没有必要了,那你就不如把这个资源呢贡献出来,哎,让其他的喜欢种地或者想种地的人呢去种。
03:22
那就是这样一个情况,那这里边提到一个叫for g c,或者叫concuent j c,那concu那个circle,它就相当于是呢,比如说车位,那国家呢,就有一天就说说我把所有的车位呢,全都收回回来,我重新的去分配啊,这样当然是可以的,能够实现一个资源的重新的一个分配和调度啊,或者说呢,国家把这个土地呢,就全部再收回国有,然后呢,再根据呃想种地的人,包括呢,你每家每户的这个人口的多少,重新的再进行个分配,诶这当然是可以的,但是这个代价呢,其实是比较大的。啊,属于这样的情况啊呃,那么基于这样问题,我们看一下怎么能够实现自动返还对内存呢?诶我们还希望尽可能的程序的执行效率还要高一些啊,那这里边我们就提到了,说这些垃圾收集器呢,应该在应用程序不活动期间,哎,不活动期间哈,尽量呢避免我们应用程序执行期间呢,你去执行垃圾回收啊,又出现了叫stop the world了啊在不活动期间呢,定期的生成或者持续的循环检查整体Java堆的一个使用情况啊,那你有存在不使用的堆内存及时的归还,那这呢,我们提到了两种方式。
04:28
啊,首先呢,是提到两个这个参数啊,第一个啊,这是提到inter啊这样一个参数,然后第二呢,提到一个叫系统的一个加载的临界值啊,你要设置成零的话呢,就表示禁用了,那这两种情况呢,只要满足一个我们就都会呃实现咱们这里边希望达到的这样一个目的。那希望达这个目的,那首先我们来看第一个啊,诶这呢提到说自上次垃圾回收完成以来,如果你超过了我们指定的垃圾回收的一个这个这个中断时间了啊,这个时候呢,如果还没有进行垃圾回收,我们就要进行一个定期的垃圾收集了,啊是这个意思哈,这儿呢,是我们上一次答题收集的一个终止时间,呃,这个完了以后,我们后续的这个时间,我们这可以指定一个叫interval哈,在这个指定的时间之内呢,如果说呃呃,如果超出了我们这个指定的时间了,诶这个时候呢,呃,还目前还不是在执行这个垃圾回收了啊,我们这时候呢,就要调用一个定期的垃圾收集了,去判断一下你到底有哪些内存呢,不再使用了,我们就要及时的归还给操作系统。
05:32
啊,是这样一个情况,就是上一次垃圾数据的末尾时间到我们指定的这个interval,这个时候超出了interval,如果此时你还不再进行垃圾回收,我们就要进行一个定期的哎垃圾收集了,呃,这是其中的一种情况啊,那另外一种情况呢,就是我们在这个应用所在的主机上去执行一个方法啊,这个方法的话呢,我们会统计,哎,默认呢,就是统计一分钟,在一分钟之内呢,我们判断一下这个系统的平均负载值啊,如果这个负载值呢,比较低啊,低于我们这里边说到的系统的一个加载的临界值的话,那就认为呢,你当前系统呢,其实负载量不高,那不高的情况下呢,我们就可以考虑进行垃圾回收了,诶触发for g c或者呢叫con j c。
06:14
啊,那一旦呢,出发for jc或coner jc的话呢,我们就会重新的去对这个堆内存呢,进行一个重新调整啊释放呢内存这个不用的内存给操作系统,那这里边呢,我们又提到另外一个问题,就是说我到底是触发for j c还是触发的叫concurrent j c。因为for这些呢,我们知道它会是stop word啊这个并发的一个JC呢,它尽可能的不会影响我们应用程序的一个执行,那这两个应该选哪个呢?这里又提到了另外一个叫invoke concurrent啊这样的一个参数啊,这个参数说如果你要是设置值了,诶我们这时候呢,就优先考虑使用这个并发的一个操作了,如果你要是没有设置值,我们就会考虑使用叫four j c。啊,区别呢,就在于一个呢是影响应用程序的一个执行啊,一个呢是尽可能的不影响应用程序的一个执行,啊,属于这样的一个情况。
07:03
嗯,好,那另外的话呢,我们还可以去设置这个堆应内存的一个大小啊,这个呢,在后续咱们讲GVM当中呢,都会提到啊,这呢涉及到对应内存的一个初始大小,最大的一个容量大小啊,最小的堆内存的一个空闲的一个比率啊,最大的一个堆内存的一个空闲的一个比率啊等等这个情况。好,这呢,就我们提到这样一个新特性啊,当然这里边儿还提到一个问题。啊提到什么问题呢,说如果定期的垃圾收集严重影响程序的一个执行了,则需要考虑呢,整个系统的CPU的负载,或者让用户去禁止啊垃圾收集,因为呢,咱们是希望呢呃及时的去查看一下,不用的内存的要回收,所以呢,你定期查看这个事儿的话呢,是呃也会耗费我们或者影响我们应用程序的一个执行的啊一旦影响到了以后呢,啊,你最好呢去考虑一个CPU的一个负载情况,或者呢,你就禁止啊去做这样的事啊这是我们所谓的有利有弊。好,这呢,就是我们所谓的一个叫这个自动返还对应内存啊,给操作系统这样的一个新特性。
我来说两句