从组成结构上看,一个Java 虚拟机(HotSpot 为例),主要包括指令集合,指令解析器,程序执行指令 等3个方面,其中:
指令集合:指的是我们常说的字节码(Byte Code),主要指将源文件代码(Source File Code) 编译运行生成的,比如在Java中是通过javac命令编译(.java)文件生成,而在Python中是通过jython命令来编译(.py)文件生成。
指令解析器:主要是指字节码解释器(Byte Code Interpreter)和即时编译器(JIT Compiler),比如一个Java 虚拟机(HotSpot 为例),就有一个字节码解释器和两个即时编译器(Server编译器和Client 编译器)。
程序执行指令: 主要是指操作内存区域,以装载和执行,一般是JVM负责 将 字节码 解释成具体的机器指令来执行。
一般来说,任何一个Java虚拟机都会包含这三个方面的,但是具体的有各有所不同:
字节码指令:JVM 具有针对以下任务组的字节码指令规范:加载和存储,算术,类型转换,对象创建和操作,操作数栈管理(push/pop),控制转移(分支),方法调用和返回,抛出异常,基于监视器的并发。被加载到JVM后可以被执行,其中字节码是实现跨平台的基础。
字节码解释器:用于将字节码解析成计算机能执行的语言,一台计算机有了 Java 字节码解释器后,它就可以运行任何 Java 字节码程序。同样的 Java 程序就可以在具有了这种解释器的硬件架构的计算机上运行,实现了“跨平台”。
JIT即时编译器:JIT 编译器可以在执行程序时将 Java 字节码翻译成本地机器语言。一般来讲,Java 字节码经过 字节码解释器执行时,执行速度总是比编译成本地机器语言的同一程序的执行速度慢。而 即时编译器 在执行程序时将 Java 字节码翻译成本地机器语言,以显著加快整体执行时间。
JVM 操作内存:JVM 有一个堆( heap )用于存储对象和数组。垃圾回收器要在这里工作。代码、常量和其他类数据存储在方法区( method area )中。每个 JVM 线程也有自己的调用栈( JVM stack ),用于存储 “帧”。每次调用方法时都会创建一个新的 帧(放到栈里),并在该方法退出时销毁该帧。每个帧提供一个操作数堆栈 ( operand stack)和一个局部变量数组 ( local variables )。操作数栈用于计算操作数和接收被调用方法的 “返回值”,而局部变量数据用于传递“方法参数”。
除此之外,每个特定的主机操作系统都需要自己的 JVM 和运行时实现。
更多关于“java培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。