你是不是还没有完全搞懂 jbm 的内存模型?欢迎来到新一期的小欧说编程,今天来给大家分享一下 jbm 的内存模型。在日常的面试中, jbm 的内存模型是我们绕不开的一个话题。 jbm 的内存模型一共分为五大块, 分别是虚拟机上程序计数器,本地方法站、堆还有方法区。这个方法区有两种实现,在 jdk 七之前, 它的实线是叫永久带,在 jdk 一点八之后,它的实线则换成了圆空间。我们先来解释一下虚拟基站,虚拟基站存储的是方法的一些局部变量,程序计数器存储的则是我们的程序执行到了哪一步。本地方法站和虚拟基站是类似的, 只是这里面存储的是一些本地方法的信息,存储的是一些西家家编写的本地方法的一些信息,而这里的堆存储的就是我们扭出来的一些对象的一些相关信息。 方法区存储的则是一些静态变量,还有一些层量,还有一些静态方法,以及我们的一些类信息。我们的 class 文件在进行被类加载之后,会产生一些类的信息,就是存储在咱们的这个方法区里面。眼睛比较尖的同学可以发现,这个图里面把这五个区分别标了两种颜色,红色代表的是现成私有的, 每个县城都会开辟单独的一块内存,而我们蓝色是县城共享的,也就是所有的县城都能访问到这个堆里面的信息,还有这个方法区里面的一些相关信息。下面我们用一串简单的代码来详细的给大家讲一下 这些存储的过程,我们这里面可以看到这一串代码,这串代码很简单,就是这里面有两个变量,我们来我们来通过这两个变量去调用这个创建的方法来创建出一个人类的类实力,然后再将其打印,下面我们来看一下它的解析过程。 我们在执行卖方法的时候,这个 id 是这个卖方法的一个局部变量,此时代码执行到这一行的时候,我们就会将 id 加载到虚拟基站里面。在执行到第二行的时候,因为我们的实菌类型它不是一种基础类型,这里面就会进行类的创建,我们会先创建一个实菌的类,创建在咱们的堆内存里面, 然后这个是类的地址,这不算,在创建的时候,他是会存储在我们的这不算常见词里面,然后这个是他的类地址, 这个是吃不穿的信息,然后这里面我们就会加载这个内幕的变量,然后这个变量的值就是我们的类地址,下面我们就去调用了这个创建方法,我们再去调用那个创建方法的时候,这里面的 id 和我们的 mate 发里面的 id 不是同一个,所以它这里面也会 往这个站里面塞入一个 id, 再到下一步,这里面的这个内幕和之前的那个内幕也是不一样的,所以我们这里面也会在站里面 塞入一个内幕的变量,但是他们的指向的类地址都是同一个,都是咱们这个常见词里面的这个对象代码在执行到这一行的时候就会去扭对象,扭对象的时候他就会在堆里面去,他就会在堆里面去开辟一块空间,用来存储这个类的信息,此时我们的账里面也会填充这个变量的信息, 这变量的值指向的就是这个类地址,这里面他通过类地址找到了堆里面的空间,然后再进行给他复制,分别复上 id 还有内幕, 最后返回这个变量。当我们的代码在执行完这个方法的时候,属于这个方法的变量就会依次从这个站里面进行弹出, 随后代码执行到这一行,我们的内方法也获得了一个人的变量,此时这个变量也会进账。 最后我们在结束内分法的执行之后,这些属于内分法的变量也会进行出证, 这个就是代码的一些完整的过程。这里面我们可以看到我们的账里面存储的一些变量信息,在执行完方法之后就会依次出账,但我们堆里面存储的一些对象信息则不会被销毁,那他们什么时候会被回收呢? 当我们在堆里面存储的这些对象信息没有指针指向的时候,在下一次垃圾回收之后就会进行回收,就会将我们堆里面的这些对象信息进行销毁。最后再用代码来给大家看一下我们的方法区域里面存储的到底是哪些信息。我们可以进入我们的代码里面,我们可以通过反变异这个代码就可以看到 一个 class 文件在进行类的加载的时候,会产生一些类的信息,这些信息就是存储在我们的方法区里面, 现在我们执行一下反变异这里面我们通过执行这个反变异的命令,我们可以看到 一个 class 文件在被类解析之后会产生这些类的信息,我们的方法区里面除了存储一些类的信息之外,还会存储一些产量,还有一些静态方法的一些信息,这个就是本期的分享视频,我们下期再见, nice。
粉丝4449获赞3.3万

我面试的时候呢,经常会问一些关于扎完内存模型的问题,但是问完之后呢,很多人上来就开始回答,扎完内存模型有几部分,组成堆积站,方法区域,巴拉巴拉的,虽然每一次呢,我都没有打断他们,而是开始接着问堆客站的区别去了,但是其实我真的很想告诉他呢,我问的并不是这个问题啊, 我想问的是扎完内存模型,而他们给我回答的那个呢,叫扎完内存结构,这完全是两回事,但是时间久了呢,我发现能分得清的人还真不多,甚至通过 google 去搜索扎完内存模型呢,首页展示在前五篇文章当中呢,就有一篇把这个东西给搞混了。 很多人可能会质疑啊,说你问这个问题和问回字有多少种写法有啥区别呢?把这两个东西区分那么开有什么意义呢?其实呢,这里面的区别可就大了,因为如果你不懂扎瓦内存模型的话呢,说明你根本就不懂计算机内存模型,那么也就相当于呢,并发编程的基本问题你都没搞清楚, 或者说呢,你可能根本就不知道并发的问题是怎么来的。所以呢,当有人在问你扎完内存模型的时候呢,不要一张嘴就直接回答对于障碍方法区了,那样会显得很不专业。你应该这样说, 扎瓦内存模型呢,这是一种符合计算机内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了扎瓦程序在各种平台下对内存的访问呢,都能得到一致性效果的一种机制以及规范。目的呢,是解决由于多线程通过共享内存进行通信的时候存在的一些原子性、可见性以及有序性的问题。

这是一段很有趣的代码, intercess 等于二十七。这是一个变量,也是今天我们重点要介绍的内容。 什么是变量?就是计算机内存单元的名称,是可以改变的量。变量是程序中最基本的储存单元。 变量是由什么组成的?数据类型、变量名和初始值。 int 就是变量的类型,每一个人都有名字,每一块内存单元也有名字,这块内存的名称就叫 size。 二十七是变量的值, 塞子,等于二十七。我们刚才说 int 是变量的类型,代表整数型。 java 中有好几种数据类型,每种类型占用空间的大小也不一样,具体可以看这里。 而这里的 int 就会告诉计算机分配三十二位四个字节。这里的内容我们后来会细说。关于变量有几个注意事项, 变量必须先声明后使用,得先声明这个变量,才能使用这个变量,如果不声明就会报错。 再一个,变量都定义在作用欲内,在作用欲内它是有效的。换句话说,出了作用欲就失效了。 作用欲就是大括号。第三,变量零,没有长度限制。第四,不能申请名字相同的变量。 第五,变量名可以任意定义,但是要符合命名规则。在扎瓦中要使用驼峰命名法,驼峰命名法就是指变量名,应该用有 有意义的英文单词。 变量名若只有一个英文单词,则所有字母都要小写。变量名若由多个英文单词组成,则从第二个单词开始首字母大写, 比如 my first name, 这里的 first 和 name f, n 都要大写。再比如 by new phone, 指这里的 new 和 phone, n 和 p 就要大写。 还有变量名不能是 java 的关键字,比如 class, public, void 等等。接下来我们演示下使用变量 in 的实现加法,跟我一起来, int a 等于一, int b 等于二, int c 等于 a 加 b, 那么我们打印 c 会输出什么呢? 我们得出结果三, 你学会了吗?

咱们继续来配置环境变量,说如何配置环境变量呢?咱们来操作,首先打开我的电脑第一步啊,首先找到第一步,我们叫做找到系统环境变量配置的地方,第一打开我的电脑, 然后呢在我的电脑上,在我的电脑上右键找到我的电脑吧,啊,或者我的计算机,是吧?找到我的电脑有的叫做计算机,然后呢在上面右键 属性,在属性里边找到系统环境变量,系统系统设置或者系统设置,在系统设置里边找到系统环境变量。系统环境变量。 那接下来咱们来操作一下,怎么找到我的电脑呢? 我的桌面上已经把我的电脑图标删掉了,可以 windows 加 e 键,快速的打开资源管理器,在资源管理器处左边,这就是此电脑啊,左边的资源列表里边就有此电脑,我就可以在这找到他。右键属性,打开这个属性窗口,在属性窗口里边注意这有个高级系统设置,我刚才写的是系统设置,对吧?也可以写成高级系统设置, 高级系统设置,那在高级系统设置里边呢,我们找到系统环境变量啊,打开这个高级系统设置,那下边呢就是有一个环境变量,看到没,打开这个界面就可以了 啊,来找到这个环境变量的设置,那找到这个环境变量以后,接下来咱们来操作两个,一个是我们添加一个 java home, 一个是来修改一个 pat 变量,一个是添加一个变量,一个是修改一个变量啊,添加一个变量 叫做 jover home, 修改一个变量, 修改的变量叫做 patch, 添加这个 jover home, 我们需要新建一个变量啊,新建一个变量,新建它分为变量名和变量值, 变量名我们就叫做 java 后注意有下划线,这是一个常亮的写法。变量值是什么呢?就是我们安装 g d, k 的那个路径,并目录之前的路径啊,并目录之前的路径,那这个路径呢?也比较好找,我们来找一下,这是不是就这个路径啊?复制过来, 这是路径并目录之前的路径,要不要并目录不要删掉,哎,这就是我们扎的 home 新阶变量所干的事。 修改个变量,修改的是系统变量,修改的系统变量在系统变量里边呢,添加一个变量,系统环境变量中添加啊,一个变量引用变量变量引用啊, 变量直升直向,那直向哪里呢?我们去写。添加一个,我们叫做在 patch 里边添加一个,叫做百分号,写上 java 下划线 home, 然后呢,来个斜杠,拼接上我们这个闭目路,所以闭目路要不要要在这里拼接?为什么要在这里拼接呢?各位? 因为以防将来你这个扎入 home 安装的位置,扎入 gdk, 你安装的位置将来可能会发生变化,你现在是装的 c 盘,将来你可能发生装在地盘,是不是也有可能将来你想装到 e 盘去?但是不论你怎么装, 你那个安装目录里始终是不是有个并目录呀?也不管你 gdk 的版本,你安装的是哪个版本,是不是你都有一个并目录啊,所以在我们整个的这个 gdk 的啊,这个工具箱所在的位置里边,其中这个并目录数并目录是始终不变的,那你变化了,是不是就这块啊?是不是这块路径的 长度,对吧?这块路径的一个内容经常会发生变化,那所以如果你经常要发生变化,你就经常会到 pass 这里边来修改,对不对?那如果你要是经常修改的话啊,那就会造成一个问题,你比如说你没有引用账号 home, 你每次都是这样的一个长,算了,你每次来修改,有可能你是不是修改错了,把其他的修改删了,或者修改了, 那就会造成一个非常大的问题,你修改了其他的就可能会造成一些系统的问题,所以最好呢,我们这一块单独拿出来做一个修改,而且给他起一个研究名字叫做扎尔霍姆,我们一眼就能知道他是做扎沃的一个配置的, 都知道这是做 java 工具的一个配置的目录,所以我们用到这个 java home 的引用啊,给它引用过来就可以了。那将来你在安装,你再安装 j、 d、 k 到其他的目录,或者发生这个版本的变化的时候,你就来修改 java home 就好了,然后在 pass 里边引用你的 java home, 能理解这个意思吧?那 再给大家举个例子,将来比如说我想这个啊,做生意啊,做生意,那比如说我做生意的话,我想跟这个 啊,全国各地的这个酒卖酒的人做生意,对吧?卖酒的人做生意,我是要一家一家的这个超市,一家一家酒店去跑啊,不需要我找一个全国代理,对吧?找一个全国代理商,那这个代理商呢?他负责去指定的地跑去,那我只需要把我的货给这个代理商是不是就行了? 相当于也是这么个意思,那我只针对的代理商,将来你的代理商,他只要是你这个代理机构不变,你里边代理的机构里边的人变了都没关系,是不是啊?其实也是一个生活中的一个逻辑映射到我们这个代码中的来的啊。那现在咱们就来干这个事, 打开环境变量,刚才我们已经打开了,下边这个就是系统环境变量,我们先给他添加一个扎入 home, 是不是啊?新增新建,上面先写一个扎入下划线 home 搞定变量值是不是就这一块啊?并不如之前的这部分 过来,你没有复制的话去复制。确定搞进去了,那第二个要修改一个变量叫 patch, 我们找一找有没有叫 patch 的。这个 jar home 是刚我们添加进去的,咱们下手是不是就它呀? patch 点编辑它就会弹出这一个页面, 在这里边的话也有个新建,这相当于给 patch 这个值,这个名对应了再添加一个值,这个值呢?我们就引用刚才我们这个 zero home 两个百分号,然后里边写上 javo home, 对吧?注意大写啊, javo 下滑线 h o m e home 的话,那个下滑线是按着 shift 键按减号键来生成的啊,然后一个斜杠写上并不 ok, 这就已经搞定了,是不是我们账号后面添加进去了?确定确定,确定, ok, 搞定了。 那接下来配置了环境变量有什么好处呢?跟刚才跟大家说的一样,我在哪里写代码都行,希望工具在哪里都能够使用。那能不能达到这样的效果呢?快来试一下。哎,配置了环境变量后, 是否能在桌面上运行我的代码了呢? 能否运行呢? 刚才那只手我们在这个目录下是运行不了的,在这个桌面上运行 hello, 小伙,是不是因为什么呢?人家说了那个工具不是内部,外部命令不允许你使用,是不是?那现在再来试一次。 windows 加 r 键,打开运行窗口,输入 c, m d, 进入到我们的命令行模式,在里边呢,我通过 c d 命令进入到我的桌面 d, e, s, k, t o p 桌面的背景,然后通过 java c 来进行编译。 hello h e l o 点 java 易回车, 哎,这回没报错,没提示。来看看桌面上是否多了一个 hello 点 class 的文件,没错吧,已经生成了 hello 点 class 文件,那至于这个文件里边写的什么内容,大家呢?你 读不懂是吧?右键你可以来看一下啊,打开方式,我们可以在记事中耳中可以打开看一下,大家看是不是都是乱码啊,只是编码的方式不一样啊,二进制了一些代码,所以说你也不认识字键码啊,那接下来咱们在里边,那我执行这个 hello 点 class 呢字键码文件呢?运行它呢? 那是不是又用到渣物工具了?试试渣物工具能不能用呗,渣物 h e l 一回车是不是也行了? hello, 渣物,哎,这个东西好,将来你的代码在哪里写都行,是不是?那建议大家在学习的过程中呢,我们代码要分门别类的去放,分门别类的去放啊, ok, 那我们来把这个来总结一下。 好,那今天的代码呢,我们也来做一个小小的一个总结,我们新建一个文件夹,这个文件夹里边呢,我们叫做 jour, 第一天 jour 零一,然后呢?我们叫做就叫零一吧,零一,我们 jour 的第一天 jour 第一章学习。 好,这是我们这个文件夹里边呢,我们再来放几个文件夹。零一,我们叫做笔记啊,零二叫做视频, 零三,我们叫做代码, 零四,我们叫做图解,如果有画图需要说明的一些东西会放到图解里啊,零五,其他资料。 ok 啊,那么对应的代码是不是就可以放进去了?代码里对不对?笔记呢?我们是这个,等会我们来修改一下笔记名称再来改啊。视频呢,我已经存放到了这里边,回头的话也会一块来放进去。那图解呢?这里 有一个 java 编译过程放到图解里啊,问方法的一个详解呢,也可以放到图解里,先放进去,然后 java 第一章的学习,我们资料生态完善。 ok 啊,那现在呢,先把这个视频咱们先保存一下啊。好,这个先关掉。

大家好,今天我要给大家介绍一下 jico jixo 加瓦自带的监控内存和和现成的性能分析器, 这这咳嗽呢?就是就是一个这个 这个性能分析工具,它是可视的, 我们一般在 j d k 的病里面,然后 j d k 病里面 使用,我点击,点击好以后我们要分析分析 哪个程序,这里面 java 自选了一个键 control test, 然后主要是那个嗯去来分析测试内存的变化情况的, 加了程序,然后就这个,然后我们直接点击这个, 然后看这里有个钙奶,这里有堆内存使用情况,现成类, 看你加载多少 cpu 的占用率,然后它这里面有,就比如内存,你看内存它已经用了多少, 像这个内存已使用多少,然后 g c 这里面执行 g c 就是否, g c 就是全前满进,那个执行否 g c 的 通知结尾 m 是通知结尾 m 是是收垃圾情况,这个理是堆的使用情况, 然后这个是监监控线程的,你看这个线程就表示说当前有多少个线程在运行,然后我们随便选一个线程, 就是 总阻止数啊,总等待数啊,我们这里面都可以通过这个来调向内,我们可以 他这里显示已加载了东,看加载了多少多少类,加少类的总数,然后卸载总数,通过这个可以随时来进行调节吗? vm 钙药,这个 vm 钙药像我们一般都需要去设置一些参数,就是这个参数,你看 这个 boar 是否支持街边访问,监听单稿号,方便运城访问,是否需要就这些参数进行设置? no and b, 我们就可以希望这样子我们就可以去看到操作,你看这个这个方法的所有的类,像我们是可以去去直接去调用这个方,直接在这里面去去调用这个方法的, 但是我们不建议这么做,一般都是在 java 里面的。这个是一个分析攻击类吗?如果你要分析的时候就比较好像这个,嗯,今天就这样吧,谢谢。

百分之九十以上的同学呢,可能都不太清楚啊,加瓦内存模型到底是个什么东西?虽然在工作中呢,可能或多或少都会用到多线程啊,也会接触到对同一个变量的兵法访问,大家应该都会想到非常 nice, 对吧? 但是其中的原理是什么啊?可能还是有一些模糊,只知道呢这么用。那么说到加完这种模型呢,他的设计的初衷呢啊,就是为了定义城市中多线城访问时各个变量的访问规则 啊,这里的变量呢,与加法中编程所常说的这个变量呢,他不是不一样的,他只包括了一些这个实力自断啊,比如说一个类中的一个成员变量啊,或者是这个金台变量啊,对吧?啊,这些变量呢,有一个共同的特征,就是属于一个共享 资源,所有的现场呢,都能够去访问到的。呃,这个资源他是不包括啊,直播变量的啊,比如说你在方法里面去啊,做一个呃变量的定义,那么这个变量呢,他是不属于啊这个 共享变量的,它是属于线上思维的一个变量,不属于加瓦内存模型考虑的范围。那么加瓦内存模型中呃,有两个特别重要的一个概念啊,啊,一个呢是主内存啊,一个是工作内存, 它是不同于 jvm 对内存的啊,属于另外一个维度的划分。那么主内存呢,它是存储所有的这个共享变量的,就是我们刚刚说的这个什么类的存在变量呀,或者金段自断啊,对吧?这些被共享的自断啊,是存储在主内存中的, 而每一个县城呢,他都有一个啊,独立于主内存的这个工作内存,就是每一个这个县城呢,他都有一个工作内存,那么工作内存呢,除了自身的一些呃私有变量以外呢,还会存储共享内存的一个副本 啊,比如说静态的字段,对吧?所有的线程呢,都会访问到,那么如果呃某一个线程用到了这个静态字段,那么在这个线程的工作内容中啊,就会有一个静态字段对应的副本, 县城呢,只能操作他自己的工作内存,不能够直接操作主内存啊,这个是核心,那么如果县城在本地啊,他比如说更新了某一个共享变量,对吧?某一个静态自断,那么等到更新完成之后呢,那么加瓦内存模型呢,就会自动的把 更新后的这个值呢来刷到主内存中啊,这个是内存模型的一个工作原理,但是呢,在使用 java 内存模型的时候呢,还是有几点需要特别注意的一个呢,就是所谓的这个可见性的问题啊, 就是形成在读取共享变量的时候,可能得到的呢,是一个过去的值,因为这个值呢,可能是在别的行程中被修改过了,对吧? 那么这种情况呢,如果是需要啊,让其他的县城能够实时的去做一个更新,那么就需要在我们的这个变量上面去加一个 vlog 的一个修饰,来保证他的可见性。 那么第二个呢,是这个原则性的问题,比如说多个县城对共享变量进行了这个啊,非原子化的一个操作啊,就会导致数据的不一致的问题, 比如说像这个爱加加,对吧啊,就可能出现不一致的问题,因为这个是一个非原子化的一个操作。解决方法呢,很简单啊,就是呃,像我们常见的说在他的这个呃参数上面去加一个 ctrl nice 的一个修饰。 另外呢还有一个重排序的一个问题啊,简单来讲呢,就是呃他需要对某一个呃 变量啊,他的执行顺序呢,做一个重排序啊,也达到他的效率的一个啊最大化。但是这种情况的话呢,可能会导致一个数据不一致的问题,同样呢也是需要通过我的跳或者非常 nice 来进行一个修饰。好了本期的视频呢,就是这些,如果您对本期的内容有任何疑问,欢迎大家在评论区给我留言,谢谢大家。

hello, 今天来给大家分享一下我们内存溢出该怎么去排查,我这边用的一个分析工具呢是 eclipse memory analyzer, 那这样的一个分析工具呢,是我觉得到目前为止我用的是比较好的一个。呃,工具。那我这边呢有一个 demo 啊,就是很简单,就是往这样的一个数组里面呢,不断的添加我们的拜的数组,大概是一兆, 然后我这边呢先要添加上这样的一段参数啊,这个意思呢是说我们初始化和最大的堆内存呢是二十兆, 然后这边有一个 help dump on out of memory error, 意思就是说我会在我内存一出的时候呢,会生成一个 dump 文件,然后存储在我们这个目录下, 然后呢我就把它添加到这边,然后应用一下。好,然后我们去运行一下,好运行之后呢,他就会在这样的一个目录下面啊生成了这样的一个 当铺文件。我们现在用这个工具呢去给他打开。 好,打开之后呢,我们点完成,这边有个 overview。 那分析内存溢出的一个步骤呢,大概有三步,我总结了一下。首先第一个呢,我们去看占用内存过大的一个对象有哪些, 然后呢第二步我们就看这个对象是被谁引用的。第三步我们可以再定位到具体的一个代码。首先呢我们去看一下占用内存过大的一个对象有哪些,我们可以去看 histogram 这样的直方图, 比如我们点击这个去点击这个,这个标志呢,就看他的一个直方图,这边显示的呢是我们内存占用的一个大小,可以看到拜的数组他占用的是比较大的,然后这边有一个浅堆和一个深堆,那浅堆跟深 堆呢,类似于浅拷贝和深拷贝的一个关系,浅堆的意思呢,只限于他这个对上占有内存的一个大小。然后第二步呢,我们看一下,他是背身引用的,我们可以去看 dominate tree, 就是支配数,然后我们可以点这样的一个 符号,那这边呢可以看到支配数的一些信息啊,其实呢就是我们的一个引用关系图,比如说我们啊魅县城这一个,他占用的一个深堆是比较大的,我们可以点进去看一下, 然后我们可以看到啊,这个里面呢有个 released, 他占用的一个啊内存是最大的,然后我们点进去看一下,这里面呢就有一个数组,然后呢占用了很多的一个败的数组,对吧? 那其实我们就找到了他是被谁引用的了,是被我们孟县城里的一个 released 给引用的。那第三步呢,我们可以定位到具体的代码,那定位到具体代码呢?我们可以点击 thread overview, 比如 是我们点击这个齿轮的这种形式,我们点进去,然后这边呢我们就可以看到县城的一个概览信息。那同理啊,我们魅县城他占有的一个深堆是比较大的,我们就可以点进去看一下, 然后它这个里面呢,其实就已经有一个 out of memory ever 异常了,对吧?这个里面呢就有一个 release 的一个集合,然后里面有一个 element data 的数组,引用了我们很多的一个对象,对吧? 那我们可以看这样的一个代码,就是 om test java 的一个二十三行,其实就已经定位到了我们 om 呃内存一出的一个行数了,二十三行呢,其实就是这一行我们不断的去添加一兆的一个数组 往我们这个集合里面。其实 demo 呢是比较简单的,但是不管是呃多复杂的 demo, 我觉得排查他内存溢出呢是比较简单的,就是这三个步骤, 反正我觉得是如果代码是你自己写的,那你可能很快就改完了。但是如果是一些中间键的代码而造成的内存溢出呢啊,就要求你对中间键的一个实现有个基本的了解才能解决。那我们之前生产上遇到的一个问题呢,就是我们县城池里面的一个有接对列啊,他设置的参数呢过长, 他设置了五千个,但其实我们的任务放到一千多个的时候呢,他就有一个内存溢出的问题了,但是他内存溢出排查的步骤啊还是这几步。那如果大家想要这样的一个 demo 以及之前写的一些 demo 的话呢,大家可以到这来 这个,然后去给他发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢就到这。