• Java虚拟机:字节码


    Java的使命是一次编写、到处执行,在不同的操作系统、不同硬件平台上,均可以不用修改代码即可顺畅的执行?如何实现跨平台?中间码应运而生,即字节码(Bytecode).

    Java的所有指令有200个左右,而1个字节可以存储256个指令,一个这样的字节就称为字节码。

    在代码执行的过程中,JVM将字节码进行解析,屏蔽了对底层操作系统的依赖;JVM也可以将字节码编译执行,如果是热点代码,会通过JIT动态地编译为机器码,提高执行效率。

    字节码主要的指令如下:

    1.加载或存储指令。

    某个栈帧中,通过指令操作数据在虚拟机栈的局部变量表与操作栈之间来回传输。常见指令:

    (1)将局部变量加载到操作栈中。ILOAD(将int压入栈)和ALOAD(将对象引用的局部变量压入栈)

    (2)从操作栈顶存储到局部变量表。如ISTORE、ASTORE。

    (3)将常量加载到栈顶,高频使用。ICONST、BIPUSH、SIPUSH、LDC(在-2147483648~21474836487或字符串压栈时使用)。

    2.运算指令。

    IADD、FADD、DADD、IMUL等。

    3.类型转换指令。

    显式转换两种不同的数据类型。

    4.对象创建和访问指令

    (1)创建对象。如NEW、NEWARRAY等。

    (2)访问属性。如GETFIELD、PUTFIELD、GETSTATIC等。

    (3)检查实例类型指令。如INSTANCEOF、CHECKCAST等。

    5.操作栈管理指令

    (1)出栈。POP、POP2.

    (2)复制栈顶元素并压入栈。DUP。

    6.方法调用与返回。

    (1)INVOKEVIRTUAL指令:调用对象的实例方法。

    (2)INVOKESPECIAL指令:调用构造方法、私有方法、父类方法。

    (3)INVOKESTATIC指令:调用静态方法。

    (4)RETURN指令:返回VOID类型。

    7.同步指令。

    MONITORENTER、MONITOREXIT支持synchronized语义。

    源码转化为字节码的过程。

    我们编写好的.java文件需要将其编译为字节码甚至是机器码才能交给机器运行。那么静态编译器如何把源码转换为字节码呢?见下图。

    1.词法分析是通过空格分割出单词、操作符、控制符等信息,将其形成token信息流,传递给语法解析器。

    2.语法解析时,把token信息流按照Java语法规则组装称一棵语法树。

    3.语义分析阶段,需要检查关键字的使用是否合理、类型是否匹配、作用域是否相等。

    4.语义分析完成后,即可生成字节码。

    字节码的执行模式

    字节码必须通过类加载过程加载到JVM环境才可以执行。执行模式有三种:1.解析执行;2.JIT编译执行;3.解析和编译混合执行(主流JVM默认模式)

     混合执行模式的优势在于,解析器在启动时先解析执行,省去编译时间。随着时间推进,JVM通过热点代码统计技术,将热点代码转换为机器码,直接交给CPU执行。

    JIT的作用是将Java字节码动态编译成可以直接发送给处理器指令执行的机器码。

    下面是一个即时编译的流程:

  • 相关阅读:
    如何修改光圈,焦距等摄像头相关信息
    白平衡是什么?怎么理解白平衡?
    如何在 kernel 和 hal 层读取同一个标志
    相机知识问答
    HDR 拍照模式的原理,实现及应用
    MTK android 工程中如何修改照片详细信息中机型名
    反差式对焦浅析
    android Camera 如何判断当前使用的摄像头是前置还是后置
    android Camera 录像时旋转角度
    android Camera 中添加一种场景模式
  • 原文地址:https://www.cnblogs.com/yn-huang/p/10757204.html
Copyright © 2020-2023  润新知