当前位置:正文

都只会有一个帧是处于激活的通用版

发布日期:2024-05-29 15:50    点击次数:107

[[286442]]通用版

jvm包括两种数据类型,基本类型和援用类型。

基本类型包括,数值类型,boolean类型,和returnAddress类型。

数值类型包括,整型,浮点型,和char类型。

boolean类型相似只好true和false。

returnAddress类型是一个指针,指向jvm领导的操作码,在Java中莫得与之对应的类型。

boolean类型的操作会被窜改为int类型的操作进行,boolean数组会当成byte数组去操作。1暗示true,0暗示false。

援用类型包括三种,类类型,数组类型,和接口类型。

它们的值是动态创建的类实例,数组,或达成接口的类实例。

数组有component类型和element类型,component类型即是数组去掉最外层维度后剩下的类型,可能照旧一个数组类型(关于多维数组)。

element类型即是数组里面存储的最少许据的类型,它必须是一个基本类型,类类型,或接口类型。

关于一维数组的话,component类型和element类型是换取的。

援用类型还有一个非凡值,即是null,暗示莫得援用任何对象。

运行时公罕有据区

jvm有一个堆,在通盘jvm线程间分享,堆是一个运行时数据区域,通盘为类实例和数组分拨的内存都来自于它。

堆在jvm启动时创建,堆中对象无谓显式开释,gc会帮咱们开释并回收内存。

方法区

jvm有一个方法区,在通盘jvm线程间分享,它存储每一个类的结构。

像运行经常量池,字段和方法数据,方法和构造函数的代码,还有非凡的方法用于类和实例的驱动化,以及接口的驱动化。

方法区在jvm启动时创建,固然方法区在逻辑上是堆的一部分。

但简便达成时不错采纳不进行gc和压缩,本圭表莫得强制条目方法区的位置,也莫得条目解决已编译代码的计谋。

运行经常量池

运行经常量池即是类或接口的字节码文献里的常量池的运行时暗示神色,它包含几种常量。

如在编译时就照旧知谈的数字字面量值,和必须在运行时剖析的方法和字段的援用,运行经常量池的功能近似于传统谈话的标识表,不外它包含的数据会愈加浅显。

运行经常量池分拨在jvm的方法区,类或接口的运行经常量池在类或接口被jvm创建时才会构建。

运行时独到数据区

pc寄存器

jvm守旧一次运行多个线程,每个线程都有我方的pc寄存器,任何时候一个线程只可运行一个方法的代码。

要是方法不是native的,pc寄存器包含现时正在被实行的jvm领导地址,要是方法是native的,pc寄存器的值是未界说的。

jvm栈

每一个jvm线程都有一个独到的jvm栈,跟着线程的创建而创建,栈中存储的是帧。

jvm栈和传统谈话如C的栈相似,保存局部变量和部分预计效果,参与方法的调用和复返。jvm栈主要用于帧的出栈和入栈,除此以外莫得其它操作,

帧可能是在堆上分拨的,是以jvm栈使用的内存不必是连气儿的。

native方法栈

native方法不是用Java谈话写的,为了守旧它需要使用传统栈,如C谈话栈。不外jvm不成加载native方法,是以也不需要提供native方法需要的栈。

每次当一个方法被调用时一个新的帧会被创建。当方法调用完成时,与之对应的帧会被殉难,无论是正常完成照旧抛超越结束。

是以帧是方法调用的具体体现神色,或称方法调用是以帧的神色进行的。帧用来存储数据和部分预计效果,和实活动态运动,方法复返值,分发超越。

帧分拨在创建帧的线程的jvm栈上,每一个帧都有我方的土产货变量数组,我方的操作数据栈,和一个对现时线法所在类的运行经常量池的援用。

土产货变量数组和操作数栈的大小在编译时就详情了,它们跟着和帧关连的方法编译后的代码一齐被提供,因此通用版帧这种数据结构的大小只依赖于jvm的达成,这些结构所需的内存不错在方法调用时同期被分拨。

在一个线程实行的任何期间,都只会有一个帧是处于激活的。这个帧被称为现时帧,与之对应的方法被称为现时线法,方法所在的类被称为现时类,此时用到的土产货变量数组和操作数栈也都是现时帧的。

一个帧将不在连续是现时帧,要是它的方法调用了另一个方法,或者它的方法罢昭着。

当一个方法被调用,一个新的帧被创建,当实行结束由蓝本的方法传递到新的方法时,这个新的帧变为现时帧。

当方法复返时,现时帧把方法实行的效果传回到上一帧,当上一帧被激活的同期现时帧会被丢弃。

土产货变量数组

每一帧都包含一个变量数组,即是都熟知的土产货变量存储的场合。这个土产货变量数组的长度在编译时详情,跟着编译后的方法代码一齐提供。

经常一个土产货变量(的位置)大要存储一个类型的值,然而long和double类型却需要两个土产货变量(的位置)能力存一个值。

土产货变量按索引寻址,第一个土产货变量的索引是0。long和double需要挥霍两个连气儿的索引,但却是按照较小的这个索引寻址的。不成按照较大的阿谁索引去读数据,然而不错写入,天然这么将使土产货变量内容衰败。

在方法被调用时,jvm使用土产货变量来接收传递进来的参数值。在类(静态)方法调用时,通盘参数被传入从索引0起初的连贯的土产货变量数组里。

在实例(非静态)方法调用时,索引0处老是传入正在其上实行方法调用的阿谁对象的援用,(即是Java中的this了),通盘参数被传入从1起初的连贯的土产货变量数组里。

操作数栈

每个帧包含一个后进先出的栈,用于存储正在实行的jvm领导的操作数,即是都熟知的操作数栈,这个栈的最大深度在编译时就已详情,跟着编译后的方法代码一齐提供。

当帧被创建时,操作数栈是空的,jvm提供一些领导用于加载常量值,土产货变量值,字段值到操作数栈上,另一些jvm领导选择操作数栈上的操作数进行操作,并把效果放回到操作数栈上。

操作数栈也用于准备将要传递给方法调用的参数和接收方法调用复返的效果。

long和double类型的值占用两个单元的栈深度,其它类型的值占用一个单元的栈深度。

动态运动

每一个帧都包含了对现时线法所属类型的运行经常量池的援用。标的是为了守旧方法代码的动态运动。class文献中姿色一个方法援用被调用的方法和被考察的变量的代码,是选择标识援用的神色达成的。

标识援用的神色不错和约略的觉得是字符串的神色,即是用字符串表明需要调用哪个类的哪个方法或考察哪个字段或变量。就像标识援用这个名字一样,这些只是是标识,是拿不到具体值的,是以必须要进行调遣。

动态运动即是把这些标识方法援用调遣为具体的方法援用,在必要时加载类来剖析尚未明确的标识,把标识变量的考察调遣为这些变量运行时所在存储结构的相宜的偏移量(索引)。这么的模式又称为后期绑定。

方法调用

一个方法调用正常完成(即莫得抛超越)时,会凭证所复返的值的类型实行一个相宜的return领导,现时帧会去还原调用者的气象,包括它的土产货变量和操作数栈,使调用者的顺序计数器相宜的递加来跳过刚刚的阿谁方法调用领导。

复返值会被放到调用者帧的操作数栈上,然后连续实行调用者方法的帧。

一个方法在调用时抛出了超越,且这个超越莫得在这个方法内被拿获处理,将会导致这个方法调用的瞬息结束,这种情况下始终不会向方法的调用者复返一个值。

非凡方法

站在jvm的级别,每一个用Java写的构造函数都以一个实例驱动化方法出现,且都吵嘴凡的名字,即是,这个名字是编译器提供的。

实例驱动化方法只可在jvm里面使用invokespecial这个领导调用,且只可在尚未驱动化的类实例上调用。

一个类或接口最多不错有一个类或接口驱动化方法,通过调用这个方法被驱动化。类或接口的驱动化方法也有非凡的名字,即是,该方法莫得参数,且复返值是void。

方法称号亦然由编译器提供的,从Java7起初,在字节码中这个方法必须被标记为静态的才行。

这个驱动化方法是被jvm隐式调用的,它们王人备不会径直被用任何jvm领导调用,仅手脚类驱动化程度的一部分被波折的调用。

Java类库

jvm必须为Java类库的达成提供阔绰的守旧。一些类库中的类要是莫得jvm协助是无法达成的。

反射,即是在运行时获得某个类的类型关连信息,如它的字段信息,方法信息,构造函数信息,父类信息,达成的接口信息。

这些信息都必须是把一个类加载完之后才不错知谈的,只好jvm才不错加载类。如java.lang.reflect这个包下的类和Class这个类。

在Java中加载一个类或接口用类加载器,即ClassLoader,背后照旧托付给jvm来达成的。

运动和驱动化一个类或接口。

安全,如java.security包下的类,还有其它类像SecurityManager。

多线程,如线程这个类Thread。

弱援用,像java.lang.ref包下的类。

公有设想,独到达成

以上内容只是jvm的一个“相对浅显”的圭表,它并不是达成决策,也不是达成细节。

达成者不错凭证本身的需要来达成jvm,如运行在后端劳动器上的jvm和运行在移动建立上的jvm笃信侧重心有所不同。

从事Java的东谈主都知谈,事实上jvm是有较多的达成版块。

由于jvm是处在Java谈话和操作系统之间的,是以它要朝上提供对Java的守旧,向下与操作系统追究交互。

写在临了

高等谈话(Java,C#)中的许多操作如文献操作,收罗操作,内存操作,线程操作,I/O操作等,都不是高等谈话本身大要达成的。

也不是它们的假造机(JVM,CLR)大要达成的,本体最终是由操作系统达成的,因为这些都是系统资源,只好操作系统才有权限考察。

要是你用Java或C#代码创建了一个文献,千万不要以为是Java或C#创建了这个文献,它们只是层层向下调用了操作系统的API,然后到文献系统API,临了可能到磁盘驱动顺序。

由此不错看出,要念念设想一门谈话,不只单是要道字、语法、编译器,类库,假造机这些,还要深度了解操作系统,以致是硬件,如CPU架构和CPU领导集等。

是以,停火话关连的事情,每一项都是超越的繁琐复杂,都需要参加大都的东谈主力、财力、时候去缱绻,临了即使缱绻得胜了,可能莫得生态,没东谈主使用,天然也无法收货。

因此,国东谈主面前还莫得一门属于我方的的确谈话。





Powered by 🏆华体汇·体育全站app官网入口(中国)官方网站IOS安卓/通用版/手机版APP下载 @2013-2022 RSS地图 HTML地图