00:00
好,在讲完本地方法接口和本地库之后呢,我们翻回来看一下本地方法站,那相当于咱们现在又回到运行时数据区当中,诶,我们讲它内部的这个结构,哎,我们讲的第三个结构,前面呢讲过了PC寄存器和虚拟站,然后下面呢,我们来说第三个结构叫做本地方法站。好,我们看一下这个信息,说Java虚拟基站呢,是用于管理Java方法的调用。啊,我们中心的应该是管理Java方法的调用是吧?应该这样说啊,而本地方法站呢,是用于管理本地方法的调用啊,其实这句话一说完以后呢,我们这一章基本上就要结束了,是吧?呃,因为非常的清楚哈,本地方法那就是管本地,本地本地方法站就是管本地方法的,而而何谓本地方法呢?咱们在上一章当中讲,呃,这个本地方法接口本地方法library的时候呢,其实已经提到过了啊,所以的本地方法呢,咱们其实主要指的呢,就是用C或C加语言来实现的这个,呃,相关的一些库,诶,我们用Java语言呢来进行一个调用啊,实现一个功能的扩展了啊行,那本地方法站呢,说了是管理本地方法的,它呢也是现成私有的。
01:16
哎,这个咱们前面也都提到过哈,也是线程私有的,然后呢,它跟咱们的虚拟基站一样,可以设计成是固定长度的大小的,或者呢,也可以是动态的进行一个扩展啊,在内存溢出方面呢,是相同的啊,跟咱们这个虚拟站整个这块讲的都是一样的,所以下边呢,你看这个信息呢也一样,如果呢,你的这个本地方法站呢,呃,设置成固定的这个大小了,超出它的最大容量就报sta or flow了。那如果呢,你可以扩展,但是呢,我们现在又无办没有办法申请到足够的内存,可能整体内存都不够了,这个时候呢,就会报auto memory啊,就是oom啊,这个跟咱们前面讲的虚拟站呢,是完全一样的啊。行,那具体做法呢,就是咱们在虚拟基站当中去登记本地方法,说白了就是如果我们需要调用到本地方法的时候啊,就比如说咱们在这个讲线程的时候,哎,我们调一个star的方法。
02:14
嗯。我们去调一个star方法,在调这个方法的时候呢,我们会在呃Java的虚拟基站当中,咱们呢,会去把这个star方法呢,作为一个战帧,呃压入到我们虚拟基站,在这个过程当中呢,如果我们需要调用到本地方法了,那那我们就会在本地方法站当中啊,本地方法站当中呢,咱们去给他,诶专门呢相当于是呃这个压入进来,然后呢,通过动态链接的方式去调用虚拟机的呃调用咱们C里边的相关的这个库。啊,由我们执行引擎呢,去调用执行啊这样。好,嗯,这呢,我们就是这个情况,呃,本地方法站呢,主要是跟我们这个本地方法接口,进而呢,本地方法库打交道的,是对他们这里边的相关方法入站的,就是进入内存的一个结构,我们来重装一下,就是用的本地方法站。
03:10
行,你看这里边红色的这个提到的啊,这个大家通常呢是不清楚的,看一下说当某一个线程在调用一个本地方法的时候呢,它就进入了一个全新的,并且呢,不再受虚拟机限制的世界,不再受虚拟机限制哈,它和虚拟机呢拥有同样的权限。啊,就跟家里边养了一条狗吧,比如说啊,这个呢,一直也没有放到,放到过这个大自然里边把门一开啊,他这就一下就放出去了,不受你管制了是吧?有点像这个意思一样啊,就是本地方法呢,咱们通常现在指的都是调用的本地的呃,系统当中的C或C加加的这个库了啊嗯,因为呢,C和C加加咱们底层的操作系统呢,也是用C或C加加呢来实现的,所以呢,一旦咱们调用了本地方法的时候呢,它就更好的能够使用咱们本地处理器的寄存器。
04:04
本地的寄存器,本地的内存等等,你想想咱们原来讲的。看这个图,咱们原来讲的是虚拟机,虚拟机呢是呃集合在咱们操作系统当中的,通过虚拟机咱们可以调用操作系统,呃,比如说你的这个寄存器呀,呃,这个本地的内存呀等等这些结构,那现在的话呢,我们调用到这个本地的这个方法了啊调用到这个C库了,C库呢是可以直接来调用寄存器和本地的方,呃这个处理器的这个寄存器和本地方法的,呃和本地内存的。所以说呢,我们说它本地方法呢,就跟虚拟机具有了同样的权限,呃,其实也正因为是能够调用本地的这个结构呢,才体现出来了一个C的一个优良特性,就是执行效率比较高。啊,执行效率高,当然呢,我们在编写代码方面呢,像C呢,还需要你主动的内存完全暴露给你,你来进行内存的一个分配和回收,这呢。
05:01
算稍微繁琐一下是吧,就是相当于开发的效率低一些,但是执行的效率呢,确实要高一些啊这样子啊,而且呢,我们可以通过本地方法呢,来访问虚拟机当中内部的运行时数据区。他俩呢,相当于是一个级别了,他可以访问这个运行师数据区的任何他想访问的位置。啊是这样啊,这是提到一个本地方法的情况,然后下面提到了。哎,两个点啊说并不是所有的Java虚尼都支持本地方法。啊,不是所有的Java虚拟机都支持本地方法,Java虚拟机呢,规范里边并没有明确的要求说本地方法站使用的语言,具体的实现方式和数据结构,如果扎尔逊尼的产品,具体的落地的产品,如果你要不打算支持,诶这个本地方法的话呢,也可以无视本地方法站。所以呢,咱们看到的这个结构,再次强调,这是houseport的一个整体的虚拟机的架构方式,诶它呢是有本地方法站的,那不意味着其他的虚拟机产品都有,咱们在Java的这个官方的规范当中啊,我们在这个tools这里边啊,这是虚拟机的这个规范。
06:08
虚息规范里边呢,我们在运行时数据区里边,呃,本地方法站关于它呢,诶有相应的这些描述啊,包括呢,也提到了这个一,这个内存溢出的等等这样的一个问题,诶我们通常呢,称为叫这个C站是吧,支持本地方法的一个调用等等,这个大家呢,下来也可以看一看啊行,那么最后一个点呢,就是说在houseboard这个虚拟机的产品当中呢,将本地方法站和虚拟机站呢合二为一了。呃,将它俩合二为一了,举个例子,你比如说咱们刚才提到的这个star的方法啊,那么当调用这个方法的话呢,在当前这个线程,就是调用star方法的线程当中,开辟一个新的战帧啊,压入站调用这个,呃,就是相当于这个star方法对应的这个战争就创建了,然后在执行的过程当中呢,我们又调用了一个本地方法站。哎,当我要调动本地方法站的时候呢,咱们就可以使用这种动态链接的方式呢,直接指向本地,呃,这个方法,然后由执行引擎呢,来进行一个执行。
07:09
啊,就直接呢,相当于是切换到本地方法的调用了啊呃,Hotport虚拟呢,咱们说了也是sun公司呢,这个正统的官方支持的虚拟机,诶,这个sun呢,咱们在上一章当中也提到了,它本身的这个解释器呢,用C来编写的,所以house bar当中呢,也自然而然的去支持本地方法站,也是名正言顺的啊,不能叫名正言顺的,应该还是叫自然而然的是吧?哎,去支持本地方法啊,行,但是呢,其他的虚拟机不一定有。啊,不一定有,咱们从整个这个,呃,咱们讲这个内容也不是专门针对houseport啊,呃,所以说大家也要关注这个问题,就是其他的虚拟产品有可能是没有这个本地方法占的,包括呢,咱们说的这个方法区这块呢,也是针对于咱们house虚拟机才有的啊,像g rocket和G9呢,是没有方法区的啊,那我们house bar虚拟呢,在JAVA8之后呢,这个呃方法区呢,其实也看到就没有了,它也跟j rock一样呢,开始考虑用圆空间啊来存储咱们类的整体结构。
08:11
好,这呢,就是咱们说的这个本地方法站啊,也比较简单。
我来说两句