00:01
好啊,除了有在每一个监控线程里面都会对它的memory的内存大小进行一个监控之外呢,那么在别的地方也会对它进行一些啊,除此除大小之外的其他条件的一个监控啊呃,那接下来呢,我们来看一下啊,第二个条件是在h region server当中有一个属性啊叫memory store flash啊,就是这个刷写者对吧?里面呢,有对应的一个线程来对它进行一个监控和控制啊。这个监控里面呢,有一个叫低水位线和高水位线啊,Low mark和high mark啊,那相对应的呢,低水位线啊,就是说呢,没有那么危险,但是已经达到了刷洗的时机啊,那高水位线呢,相对应就已经非常危险了,不仅要刷写,并且要对它进行一定的控制啊,避免造成内存溢出啊,还是那句话,写缓存里面的数据比较宝贵,一般不会去删,你要把它删的话,你接下来的操作会麻烦,对吧?I在哪里面呢?哎,不断的去重复的去调啊。
01:02
那么低水位线的值大概是多少呢?啊,这边有对应的一个介绍啊,叫低水位线的值呢,是我们给到h base g vm的一个堆的总内存,然后呢,乘以40%啊0.4,这个40%呢,指的是所有的斜缓存能够占用的总内存,同时呢,会有一个95%的一个限制,叫lower limit啊其实就是低水位线的一个百分比,那达到95%之后呢,他就认为啊,这个内存啊马上就满了,所以呢,你应该及时刷新,注意这个地方的内存呢,跟上面128兆内存是并行的啊,两个人是互不影响的,也就意味着如果触发了下面这个低水位线的一个刷新呢,就意味着这个里面的这个呃,Store啊,Store里面那个memory store对应的那个呃,数据量它是没有达到128兆的,也就是说大概是80兆或者是100兆,那为什么80兆或者100兆就已经达到了总大小的呢?哎,可能。
02:03
能啊,是你的memory store太多了啊,Memory store太多了,这里呢,我们也可以看得出来,如果你在设计你的表格的时候啊,你设计的呢列足啊,还有这个啊region特别的多,对吧,跟你的h base的内存不相匹配的时候,它在进行文件的刷写的时候呢,实际上是没有办法达到128兆的啊,在后面呢,官方也会给我们一个提示,你在使用的时候啊,尽量避免使用过多的列足啊,尽量避免使用过多的列足,就是为了呢,让他刷写的时候,尽量按照128兆来进行刷写。好,一旦达到这个大小呢,就会进行刷写,那同时呢,还会有一个高水位线,如果达到高水位线了,就是已经分配到的所有的内存全部占满了,会阻止继续往memory写道里面写数据啊,跟上面是一样的,都是为了避免内存溢出。好有的同学可能会想要去思考一下,如果真的达到40%,它会不会内存溢出。
03:02
对吧,我们看这是Java的堆内存啊,这是分配给斜缓存的40%,如果真的占满40%了,会不会内存溢出啊,实际上如果仅仅是写缓存占满40%的话呢,它是不会内存溢出的,你可以思考一下,写缓存非常重要,但只占了40%,那对应的还有60%对不对?我们的GVM呢,有自动垃圾回收的功能啊,我标记的时候标记了你这个写缓存不能进行垃圾回收,那并不意味着别的地方不行,比方说读缓存,哎,咱们已经看过了,读缓存只是为了下一次读的时候方便,里面的数据呢,本来就存在很早很早之前读的,它本来就是可以拉就可收到,所以这个地方啊,它不会达到这个大小,不会马上就内存溢出的啊,还还是有一定的哎,容这个缓缓冲的移动一定空间的啊,所以呢,我们只需要阻止往里面写数据啊。不要再继续增加了,继续增加就很危险了,就可以了啊,这是我们关于内存大小的一个介绍,那这里呢,既然提到了它是有代码里面的哪部分组成的,咱们也可以去对应的去看一下啊,来到idea里面,它说是在h region server里面,那我们CTRL加H啊,这里面搜索h region server,那第一个就是回撤。
04:15
好,找到这么一个类之后呢,我们来找里面跟刷写有关的东西啊,你可以呢往下翻啊,你也可以直接用快捷键,这里面有memory store flash刷写者么?你也可以按CTRL加F12,这样的话呢,可能好找一点啊,自己去看好我们对应的点这么一个类,点完这个类之后呢,我们找里面实际操作刷写的线程啊,它的线程在哪呢?你往下翻,这里面会有一个flash handle啊,刷写的一个处理者,他那不是处理者吗?点这么一个类啊,它会跳转到这个对应memory store里面的内部类里面,这个内部类明确就写了,它就是一个线程,那这个线程呢,对应就会有run方法对不对?我们运行的时候呢,运行的就是这个run方法,看一下它是如何控制这个刷写的,它有一个while处。
05:06
啊,这里可以认为是well处啊,因为你只有在server stop的时候它才是false,对不对,它写了一个感叹号嘛,对吧?啊,你只要服务没有关闭,它一直运行,它如何一直运行呢?首先它写了一个对象,这个对象呢是刷写信息。Flash q entry对吧?刷写信息,然后在下面的地方,它有一个判断叫flash time刷写的类型,这个类型呢,有一个判断叫is above low water mark啊叫低水位线,还是那个问题,你达到高水位线,你一定达到了低水位线对不对?两条水位线并行检测,如果达到低水位线,我就刷写高水位线,我同时加一个组织往里面写的一个功能就可以了,这里呢,就会有一个如何判断是低水位线,你点开。点开之后呢,它有一个server get region server account,然后判断这个方法,主要还是这个方法对不对,你点你点完之后,这里面就会有详细的一个介绍啊,三个条件都会达到低水位线啊,那我们为什么在介绍的时候没有说三个条件呢?啊,这个跟内存的分配有关,我们可以看到啊,它都在搞一个什么global memory store,对吧?Global memory store它只是后面不一样,你看of he size he size还有一个。
06:20
别的hiph萨对吧?啊,它有堆外内存啊,它有堆外内存啊,可能呢,对大家GM的这个知识呢,要求的高一点,咱们就不考虑这么多了,咱们只考虑总的一个堆内存啊,总的一个堆内存好,你点击这么一个limit的一个参数啊,我们可以找到呢,它对应的一个温值CTRLCCTRLF。等于往下找啊,它里面呢,就会有一个默认值,咱们看这个代码啊,不太方便啊,那你不如呢,看这个注释更方便一点,对不对,它这个默认值什么呢?限制什么呢?就是总内存的95%,也就大概是我们整个GM内存的百分之三十八四十乘以95%嘛。
07:00
对吧,大概达到这么一个标准,就达到了低水位线啊,那我们再退回来啊。退回来啊,如果达到低水位线开始去进行刷写,如果进行刷写呢,这边有对吧,得到的类型不是一个no normal啊,不是一个普通类型,那它就是低水位线或者高水位线了,呃,这个地方它得到的只能是呃低水位线对不对,括号里面先打印一个日志,跟我们没关系啊,然后这里呢,他写了一个bug的一个情况啊,他说这种情况下不太可能出现啊,是不是出现什么bug了,他睡了一秒啊,他他既然说了不太可能出现,那大神都说了,咱们呢也不用去管它,直接看下面就行了,他叫醒了一个刷写线程,同时在下面获取了一个,哎。刷写的那个region的一个信息,给它转换一个对象,转化对象之后调用了一个flash region这个呢,就是直行刷写啊,直行刷写它的返回值是一个布尔类型啊,返回值是布尔类型,如果成功的话,Break停下来就可以了,把那个while停下来,它是一直监控,一直监控,监控到什么时候呢?监控到刷写为止嘛啊吧,刷写了之后呢,这个里方这个里面又会启动别的线程啊,它一个互相套玩就可以了啊。
我来说两句