00:00
下边啊,咱们给大家讲两个概念,一个呢叫做安全点,一个呢叫做安全区域,那光看这个名字的话呢,似乎感觉好像说挺复杂的似的是吧,那其实上呢,比较简单啊比较简单行,那我们来给大家解释一下这两个词呢,分别是什么意思啊,了解一下就可以了,那所谓的安全点呢,我们称为它叫s point啊说呢,程序在执行的时候,并非在所有的地方都可以停下来呢,开始GC。啊,要理解这样一个概念,也就是说呢,咱们这个绿色的这个用户线程呢,正在执行,说这个用户线程执行到一定程度的时候呢,我们现在要开始JC了,诶这呢,会发生一个叫s tw stop the world,那所有的用户线程呢,都停下来等着我们这个垃圾回收线程去执行,那这里边我们需要注意到这样一个事实,就是说呢,并不是我们说这个应用程序,这个线程在任何一个时间点上都可以停下来的。这是不对的,那我们说呢,只有在特定的位置才可以呢,让我们这个应用程序的这个线程呢,停下来开始JC,那么这些所谓的特定位置啊,咱们呢,就称为呢,叫做安全点,那我画一个呢,简单非常简单的一个图,比如这呢,就是一个时间轴,那么在这个时间轴上呢,我们现在有一个用户线程。
01:12
嗯,红色的啊,我们这儿呢,有个用户线程呢,正在这块去执行,那么我们现在呢,不是说不是在任何一个点上呢,咱们都可以让当前这个线程呢给它,哎停下来啊,这呢出现一个叫it tw,不是这样子的,咱们呢,只能是在你这个时间执行的这个过程当中啊,咱们从代码的角度上呢,我们去可以划归啊,画一些这个具体的一个点,这个点呢,咱们称为呢叫做安全点,那我们这个用户线呢呢,只有在我们这个安全点上啊,当然一会儿我们还要提一个安全区域的问题,是吧,咱们先理解这安全点,只有在这个安全点上呢,我们才可能让他呢进行一个stop the word这样一个行为,让我们这个垃圾回收限制呢,开始进行垃圾的一个回收,哎,就是主要注意这个事儿啊,就是这就叫安全点,那么这个安全点我们说这个选择啊,是比较重要的啊,怎么讲呢,说如果太少的话,你像如果我们整个这个,呃,应用程序呢,在执行过程当中,如果我们设置这个安全点太少,那就导致咱们这个JC啊,等待的时间是不是就太长了。
02:08
你想你这里边画的这个点就特别少呗。等待的时间过长,那这时候你要真的去执行一次这些的话呢,由于你这块呢,用户线程执行的过多了,那这个时候我们说这个GC呢,也有可能让SWSTW这个时间呢,呃,发生的就比较长一些。对吧,可能会这样啊,这是一个,那另外的话呢,就是如果你始终不让它实现这个JC的话呢,这个内存呢,也有可能会oom,对吧?哎,这要注意,那下一个呢,就是说如果太频繁呢,可能导致运行时的这个性能问题,你想我们稍微还没执行多一点这块,你就让它S那下是吧?哎,还没执行多一点又S那下,就不断的去进行垃圾回收,那你想想我们这个不断的去切换,那使得我们这个用户限制呢,是不是这个性能呢,也会更差一些啊。啊,这个都非常好理解是吧,那么我们在选择这个sing的时候呢,应该遵循什么样的标准呢?哎,这里边提到了,说大部分这个程序的这个指令啊,执行的时间都非常的短暂,那CPU呢也很快是吧,快速的我们说这执行引擎啊,从这个呃操作指令的地址上,我们取出具体的这个呃指令是吧,然后就开始执行了,大部分这个指令啊,执行速度呢都非踌快的,那我们呢,要选择一些叫执行时间比较长的一些指令,哎,作为这个叫sport。
03:22
啊说是否具有让程序长时间执行的一个特征,比如说方法调用的时候,哎循环跳转的时候啊,异常跳转的时候,在这个跳转和这个调用新的方法的时候呢,我们这个呃执行的时间呢,就相对来说较长,比如说你这个方法又调用个新的方法的时候呢,我们要把另外一个新的方法是不是叫压入这个战争,呃压入这个它的这个战争压入这个虚拟战对吧?呃,它的执行时间呢,相对来说较长,我们把他们呢作为这个叫S呢是比较合适的。那如果说人家这个程序呢,其他这个指令展览这个指令非常快,你现在让他停下来,实际上呢,也是会影响这个性能嘛,所以最好呢,不要在这个执行比较快的这些,诶过程当中,指令当中呢,我们去设置S对吧。
04:04
那这个呢,应该不难理解啊行,那么下一个呢,就是说我们如何在发生这个GC的时候啊,如何能够保证咱们所有的这个用户线程都跑到最近的安全点停顿下来呢。对吧,诶跑跑到他自己最近的安全点停留下来呢,这里边呢,提到两种方式,那这个有可能在面试的时候呢,可能会问啊,当然这个呢,也是比较细的一个点了,那第一种呢,我们称为呢叫抢先式的中断,第二呢重为着主动式的一个诶中断。那什么叫抢先式的中断呢?啊就是说呃,首先呢,让我们这个所有的这个用户线程呢,先走中断,先都停下来啊停下来以后呢,我们看看是不是有的这种线程啊,它不在这个安全点上,那你要不在安全点上呢,咱们再给它恢复起来,让它呢跑到这个安全点上。啊,这个呢,其实你一想就觉得这个事儿呢,不太靠谱是吧,诶所以目前呢,我们这个虚拟机呢,已经不再采用了,那目前呢,用的我们都是叫主动式的一种中断。诶主动式的一种中断啊,就是说我们设置一个这个中断的标志,那各个线程呢,运行到这个声炮的时候呢,它就轮询这个标志啊轮巡,那只要呢发现这个标志呢是真的,那就意味着我们现在就想进行JC了,那你呢就停下来,那如果要是假的话呢,这个时候你就可以考虑呢,继续先去执行。
05:14
啊,这里有一个这个轮询的一个操作啊,这个大家诶注意这个问题行这儿呢,就是我们说的这叫安全点,哎,这样一个概念啊,不是特别困难,那下面呢,咱们来看这个叫安全区域啊,叫civil啊。这个为什么我们有了安全点,还要提到一个安全区域呢,这里边儿主要呢,是针对于咱们有些用户线程啊,诶它会进入这个。叫什么呀?诶进入一段叫不执行的一种状态,比如说我们这个线上呢,处于一个sleep状态,或者叫block的状态,阻塞了啊,或者叫睡眠了,那这个时候的话呢,他就无法去响应我们这个GM的一个终端请求,你让他这块走到是吧,这个比较形象啊,你让他走到这个安全点呢,去挂起这个事儿呢,就不太靠谱,嗯,不可能把它再唤醒啊,对吧?那这时候怎么办呢?我们就可以设置一个叫安全区域。
06:02
嗯,安全区域有点类似呢,我们这儿呢,是这个程序的一个执行过程,对吧,然后在这里边我们,诶专门设置这一个区域。嗯,甚至这个区域呢,它都是安全的,只要落在这个区域内,咱们都可以呢,考虑,哎,这个让当前这个用户线程呢,停下来,我们进行这个GC线程的执行。哎,就是这样的道理啊。其实这块呢,我们提到这个安全点,安全区域呢,大家可以想象,像以前的这个,咱们说古代呢,要想送信啊,送信的话呢,是不是都有那种叫驿站呀,驿站,因为咱们以前呢,说这个交通工具呢,主要是马嘛,这个马的话呢,它只能是跑一定的这个路程,跑多的话呢,它也收不了,所以呢,我们就是诶从比如说嗯,从北京,当然之前呢,咱不叫北京啊,比如说你这个到这个南京行,哎从这到这儿,然后这块呢,我们就中间呢有很多的这个驿站,然后然后每一个驿站呢,就是你可以让这个马呢休息一下,那这个每一个驿站呢,大家就可以理解成叫安全点嘛,那你休息的时候呢,就得是到这安全点上才行,你在中途呢就不能休息。
07:01
或者就不不休息对吧,哎,那你中途的就相当于是用户线程的执行在这个安全点的位置呢,我们才考虑呢,休息一下执行这个JC的线程是吧?哎,就这个道理啊。好,那这呢,我们就提到了一个叫安全区域的这个问题啊,主要呢,是用来应对咱们说这个线程呢,它处于一个呃长时间的呃,这个中断的一个情况是吧,没办法去执行的一个状态啊,说安全区域呢,它是指一段代码片段啊,是指在一段代码片段当中,对象的这个引用关系呢,不会发生变化,在这个区域内的任何位置都可以作为JC啊的一个开始的情况。啊,开始的这个点,就像我们说这个sleep跟block的这个时候是吧,对象的引用关系呢,它不会发生任何变化啊,OK啊,那我们可以呢,把这个s read呢,看作是扩展了的这s point啊很好理解,行,那么具体这个执行的时候呢,我们这样来理解啊,说当线程运行到save的这个啊,Save region这个代码的时候,首先啊标识已经进入了,这叫civil。啊,我已经进入这个叫安全区域了,那么如果这段时间之内呢,咱们发生GC啊,那么GM就会忽略标识为CV线程的这个状态啊状态这个线程,也就是说呢,我们就哎开始执行这个JC,你这个用户线上就不要执行了。
08:13
啊,因为本身在这个区间之内,你也没有任何引用关系发生变化是吧,那你就停下来呢,让我们进行这个GC的执行,说呢,当线程即将离开,这个叫save region的时候呢,我们要检查一下这个GM呢,是不是完成了JC,那完成了,那就让这些用户现场继续执行,那你要是没完成,没完成呢,就等待一会儿,诶直到呢,我们这个可以安全离开这个C瑞的时候呢,我们再呃离开。OK是吧,这呢就叫安全区域行,呃整个呢,这两个概念呢,不是特别复杂啊,当然里边蕴含的这个主要点,一个呢,就是说我们这个呃安全点如何呢,来确定所有的线程呢,都停顿下来了,这呢提到两种方式,这个大家关注一下啊,以及呢,这个为什么我们要引入这个安全区域啊,这两个主要问题呢,大家关注一下就可以。OK啊,比较简单的两个概念。
我来说两句