【Java】JVM(六)虚拟机字节码执行引擎

虚拟机字节码执行引擎(虚拟机是如何执行字节码指令的) 最近一直在学习《java虚拟机》这本书,根据自己的理解,进行如下总结,希望能和大家交流学习。 本节是对第八章8.4节的学习总结,关于:虚拟机字节码执行 基于栈的字节码解释执行引擎 一. java代码的执行 首先,我们要清楚,许多Java虚拟机的执行引擎在执行Java代码的时候,都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择, 本文首先探讨在解释执行时,虚... 阅读详情

一、概述

  执行引擎是虚拟机中最核心的部分之一, 虚拟机自己实现引擎,自己定义指令集和执行引擎的结构体系。

 

二、栈帧

  栈帧包含(1)局部变量表、(2)操作数栈、(3)动态链接、(4)方法返回地址、(5)额外的附加信息

  栈顶的栈帧为当前栈帧,是唯一有效的。

 

  2.1 局部变量表

  用于存放方法参数和方法内部定义的局部变量。单位为槽(Slot),每个槽可以存放一个变量(Boolean,byte,char,short,int,float,reference,returnAddress),lonng,double需要两个槽。

  2.2 操作数栈

  Java虚拟机引擎称为“基于栈的执行引擎”,栈就是操作数栈。

  2.3 动态链接

  每个栈帧都有一个指向运行时常量池的所属方法引用,目的是:支持动态链接。

  静态链接:Class文件中有大量的符号引用,字节码中方法调用指令,以常量池中指向方法的符号引用为参数在类加载阶段或者第一次使用时候会转化为直接引用。

  动态链接,在运行期间化为直接引用。

  2.4 方法返回地址

  两种方法退出:(1)遇到返回关键字。(2)遇到异常

  实际操作:当前栈帧出栈,恢复上层方法的局部变量表和操作数栈,返回值压栈(操作数栈)

  2.5 附加信息

  允许具体的虚拟机实现增加一些描述信息。

  

三、方法调用

  方法调用:确定要调用的版本(即:调用哪个方法)

  3.1 解析

  所有方法在Class文件中都是一个字符串的常量引用,在类加载期间会将其转换为直接引用。

  解析:方法在真正运行之前必须有一个确定版本,并在运行期是不可变的。

  3.2 分派

  3.2.1静态分派

  依赖静态类型来进行方法执行版本的分派动作。

  发生时期:编译阶段

  调用指令:invokestatic

  应用:方法重载

public class StaticDispatch {
    static abstract class Human {

    }

    static class Man extends Human {

    }

    static class Woman extends Human {

    }

    public void sayhello(Human guy) {
        System.out.println("Human guy");

    }

    public void sayhello(Man guy) {
        System.out.println("Man guy");

    }

    public void sayhello(Woman guy) {
        System.out.println("Woman guy");
    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        StaticDispatch staticDispatch = new StaticDispatch();
        staticDispatch.sayhello(man);// Human guy
        staticDispatch.sayhello(woman);// Human guy
    }

}

  输出结果:

  Human guy

  Human guy

  原因:

  下一行代码:

Human man = new Man();

  其中Human为静态类型, Man为 实际类型 

  两者的区别是:静态类型编译期间可知, 实际类型运行期可知。

  重载是通过编译期间的静态类型确定调用哪个函数, 所以Javac会根据静态类型 Human来确定调用的函数为 sayhello(Human guy)

  

  3.2.2 动态分配

  运行期根据实际类型确定方法执行版本的过程为动态分配。

  调用指令:invokevirtual

  应用:方法重写

  

public class DynamicDisptch {

    static abstract class Human {
        abstract void sayhello();
    }

    static class Man extends Human {

        @Override
        void sayhello() {
            System.out.println("man");
        }

    }

    static class Woman extends Human {

        @Override
        void sayhello() {
            System.out.println("woman");
        }

    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        man.sayhello();
        woman.sayhello();
        man = new Woman();
        man.sayhello();
    }

}

  运行结果:

man say hello
woman say hello
woman say hello

  

 

 

  动态分配运行时解析过程:

  1.   找到操作数栈顶的第一个元素所执行的对象的实际类型,记作 C。
  2.   如果在类型 C 中找到与常量中的描述符合简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束;如果不通过,则返回 java.lang.IllegalAccessError 异常。
  3.   否则,按照继承关系从下往上一次对 C 的各个父类进行第 2 步的搜索和验证过程。
  4.   如果始终没有找到合适的方法,则抛出 java.lang.AbstractMethodError 异常。

  invokevirtual 指令在运行期确定接受者的实际类型,所以会将同一个方法解析到不同的函数上。这就是Java重写的本质。

  

  3.3 单分派与多分派

  方法接收者与方法参数统称为方法的宗量,根据分派基于多少种宗量,可以分为单分派和多分派两种,

  单分派:根据一个宗量对目标的方法选中

  多分派:根据多个宗量进行目标方法选中

 

  

/**
 * 单分派、多分派演示
 *
 */
public class Dispatch {
 
	static class QQ {}
	
	static class _360 {}
	
	public static class Father {
		public void hardChoice(QQ arg) {
			System.out.println("father choose qq");
		}
		
		public void harChoice(_360 arg) {
			System.out.println("father choose 360");
		}
	}
	
	public static class Son extends Father {
		public void hardChoice(QQ arg) {
			System.out.println("son choose qq");
		}
		
		public void harChoice(_360 arg) {
			System.out.println("son choose 360");
		}
	}
	
	public static void main(String[] args) {
		Father father = new Father();
		Father son = new Son();
		father.harChoice(new _360());
		son.hardChoice(new QQ());
	}
}

  运行结果:

  

father choose 360
son choose qq

  静态分配:在编译阶段,也就是静态分配过程中,选择目标的依据有两点:(1)静态类型是 Father 还是 Son(2) 方法的参数是 QQ还是 360。 所以静态分配为多分派。

  动态分配:在运行阶段,也就是动态分配过程中,由于静态分配过程中已经知道函数必须是 hardChoice(QQ arg) ,其中参数的类型编译器不会关心, 只会在意方法的接受者到底是Father 还是 Son 所以动态分配为 单分派。

  3.4 虚拟机动态分派的实现

  动态分配需要查找合适的方法,为了提高性能, 一般的处理方法是:用稳定的手段,为类在方法区建立一个虚的方法表。使用索引表来代替查找。

  虚方法表中存储了各个方法的实际入口,如果在子类中没有重写该方法,那么子类的虚方法表中的地址和父类的一样, 如果重写了,则指向重写之后的方法入口地址。

  初始化时间:虚拟方法表一般在类加载链接期间进行初始化,准备好初值之后虚拟机会将类方法初始化完毕。

 

  

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析 阅读详情

相关推荐

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 779

java执行引擎是什么_JAVA虚拟机(JVM)详细介绍(六)——字节码执行引擎

JVM中的执行引擎在执行java代码的时候,一般有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择。栈帧定义:栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它位于虚拟机栈里面。作用:每个方法从调用开始到执行完成的过程中,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。特点:(1)栈帧包括了局部变量表,操作数栈等,到底是需要多大的局部变量表,多深的操作数栈是在...

weixin_32191051的博客 360

安全虚拟化SEV简单介绍

安全虚拟化SEV简单介绍什么是SEV什么是SVMSME介绍SEV介绍总结 什么是SEV SEV是由AMD提出的安全虚拟化Secure Encrypted Virtualization技术的英文首字母的缩写。简单来说就是主内存控制器具备了加密功能可以对虚拟机内存数据进行保护。在真正介绍SEV之前,我们首先要弄清楚两个关键的基本概念:SVM、SME。下面先简单了解一下SVM和SME。 什么是SVM S...

artine的专栏 6389

java虚拟机调用字节_JAVA虚拟机(JVM)详细介绍(六)——字节码执行引擎

详细内容JVM中的执行引擎在执行java代码的时候,一般有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择。栈帧定义:栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它位于虚拟机栈里面。作用:每个方法从调用开始到执行完成的过程中,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。特点:(1)栈帧包括了局部变量表,操作数栈等,到底是需要多大的局部变量表,多深的操作...

weixin_39632291的博客 105

【Telephony】Telephony总纲!Phone进程流程(AOSP)

整个Framework层的Telephony框架运行在一个叫做Phone(com.android.phone)的进程中。 Phone进程启动的过程中,会初始化非常多的分支功能,SIM卡流程初始化就是其中之一,所以我觉得有必要写一下Phone进程的框架

weixin_44513784的博客 1975

R语言实战:非正态数据下的Scheirer–Ray–Hare检验全流程解析

本文详细解析了在R语言中执行Scheirer–Ray–Hare检验的全流程。当数据不满足正态分布假设时,该非参数检验是传统双因素方差分析的有效替代方案。文章从原理、R环境配置、数据准备、代码实现、结果解读到事后比较与可视化,提供了完整的实战指南,帮助研究者稳健地分析多因素实验设计中的主效应和交互效应。

cc789的博客 406

《JVM系列》 第七章 -- 字节码执行引擎

执行引擎属于JVM的下层,里面包括: 解释器、及时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现*,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。

龙源IT 的博客 7656

投入产出表之直接消耗系数和完全消耗系数计算--基于Excel

介绍 上篇博客已介绍投入产出表的结构类型及意义解读,在此就不重复写了。 投入产出法中相对稳定的因素是一些系数,根据投入产出表可以计算很多系数: 案例 案例数据即流量矩阵,采用的是中国2012年的部分行业数据,若有不对,请批评指正哈。 直接消耗系数的计算 根据上表和直接消耗系数的计算公式,直接消耗系数矩阵通常用A表示。农林牧渔产品和服务部门对其他部门产品的直接消耗系数分别为: 这些消耗系数的经济意义是,农、林、牧、渔产品和服务部门每生产单位(1亿元)总产出,要直接消耗0.1378亿元本部门产品,0.26

m0_46271335的博客 7万+

深入JVM字节码执行引擎

我们都知道,在当前的Java中(1.0)之后,编译器讲源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了JVM的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。

Floating Cat 1万+

2024年上半年试题二:论性能测试方法及其应用

2025年1月,我以系统分析师的身份参与了公司OA系统的开发与建设。该系统包含的功能有打卡签到、公文流转、工资查询等。我们吸取了之前由于系统使用人数激增暴露出的短时间卡顿等问题,所以在本次开发中,我们非常重视系统的性能测试。通过自动化的测试工具模拟多种正常、峰值及异常负载条件对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样,常见的负载测试和压力测试都属于性能测试。

银帅 548

Xilinx/AMD公司7系列FPGA的ISERDESE2仿真的”天坑”(附verilog的源码vivado仿真工程)

研究LVDS输出接口的ADC与7系列(ZYNQ)FPGA对接过程中,在Vivado中搭建了ISERDESE2的仿真工程,仿真结果ISERDESE2的并行输出口一直输出X或Z,这个坑之大,耗费了我数天的时间,可以称为“天坑”了。同步复位的要求肯定是高于异步复位的,古话说得好“两害相权取其轻”,所以,跟古话对着干就对了!就当RST是同步复位吧,最后经过反复验证,发现。开始怀疑复位信号是否高电平持续时间不够长?但是没有查到复位时间的要求 : - (

FPGA艺术家的博客 171

java 虚拟机(jvm)-10-JVM 字节码执行引擎

Java虚拟机的执行引擎 输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。 本章主要是从概念模型的角度讲解虚拟机的方法调用和字节码执行。 帧栈 帧栈是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。 每一个帧栈中都包括以下信息:局部变量表(Local Varable Table)、操作数栈(Operand Stack)、动态连接(D...

1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JVM的执行引擎

执行引擎、包括解释器和JIT编译器的介绍

scj1022的博客 2114

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JVM学习-字节码执行引擎

JVM-字节码执行引擎

疼了也不哭的博客 1068

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JVM字节码执行引擎

概述        执行引擎是Java虚拟机最核心的组成部分之一,“虚拟机”是一个相对于“物理机”的概念,这两种机器都具有执行代码的能力。其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集和执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。        在Java虚拟机规范中制定了虚拟机字节码执行...

IT_GJW的博客 3302

JVM篇·虚拟机字节码执行引擎

虚拟机字节码执行引擎 本文为《深入理解Java虚拟机_JVM高级特性与最佳实践·周志明》学习笔记 文章目录虚拟机字节码执行引擎运行时栈帧结构局部变量表操作数栈动态连接方法返回地址附加信息方法调用解析5条方法调用字节码非虚方法分派静态分派重载重写场景重载优先级动态分配invokevirtual执行分派步骤单分派&多分派虚拟机对动态分派的实现动态类型语言支持动态类型语言Java的动态类型支持原理反射与MethodHandle对比基于栈的字节码解释执行引擎解释执行基于栈/寄存器的指令集对比 运行时栈帧

qq_37419449的博客 6611

深入解析JVM字节码执行引擎

JVM字节码执行引擎核心机制 执行引擎是JVM的核心组件,负责将字节码转换为可执行操作。其核心机制包括: 栈帧管理:每个方法调用创建包含局部变量表、操作数栈等结构的栈帧 指令执行:采用基于栈的架构执行字节码,通过解释器逐条解释执行 JIT优化:对热点代码进行即时编译,使用C1/C2编译器进行多级优化 方法调用:支持静态/动态分派机制,处理不同类型的方法调用 性能优化:运用方法内联、逃逸分析等关键技术提升执行效率 执行引擎通过解释执行与即时编译相结合的方式,在保证跨平台性的同时优化性能表现。

2301_80215285的博客 1169

【JVM】执行引擎 Execution Engine

执行引擎是Java虚拟机(JVM)的核心组成部分之一,它的主要任务是负责装载字节码到其内部。由于字节码并不能够直接运行在操作系统之上,因此需要将字节码指令解释/编译为对应平台的本地机器指令,简单来说JVM的执行引擎充当了高级语言翻译为机器语言的译者。

weixin_40381772的博客 2776

深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎

不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。

Oceáno的博客 1655

一夜搞懂 | JVM 字节码执行引擎

前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步 首先,抛出灵魂三问: 虚拟机在执行代码的时候,如何找到正确的方法呢? 如何执行方法内的字节码呢? 执行代码时涉及的内存结构有哪些呢? 如果你对上...

weixin_36518952的博客 1265

深入理解JVM之虚拟机字节码执行引擎

读了深入理解JVM之虚拟机字节码执行引擎这一章,

Sweet Baby,甜宝 1681

JVM——虚拟机字节码执行引擎

虚拟机的执行引擎由软件自行实现的,可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式不同的虚拟机实现,执行引擎分为:解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)所有的Java虚拟机的执行引擎输入、输出都是一致的:输入字节码二进制流,处理过程是字节码解析执行的等效过程,输出执行结果。

weixin_45021712的博客 1043

JVM的故事——虚拟机字节码执行引擎

执行引擎Java虚拟机的核心组成之一,它是由软件自行实现的,能够执行那些不被硬件直接支持的指令集格式。对于不同的虚拟机实现,执行引擎可能会有解释执行和编译执行或者两种兼备,但是所有执行引擎的输入输出都是一样的,输入的是字节码二进制流,输出的是执行结果。

weixin_45841848的博客 963

JVM第八章-虚拟机字节码执行引擎

执行引擎是Java虚拟机核心的组成部分之一。所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果本章将主要从概念模型的角度来讲解虚拟机的方法调用和字节码执行。

weixin_44925329的博客 1245

Java JVM:字节码执行引擎(六)

执行引擎是 Java 虚拟机核心的组成部分之一,执行引擎由软件自行实现

AcWare 学习笔记 585
上一篇: 【Java】JVM(五)、虚拟机类加载机制
下一篇: 【Java】杂项、Equals 和 hashCode
三生石1103
博客等级 码龄12年 16粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值