当前位置:首页 > 虚拟机 > 正文

java 虚拟机详解


一、Java虚拟机栈与栈帧详解

在Java编程中,栈和堆是两个主要的内存区域,各有其独特的作用和功能。首先我们来深入了解一下区别:


堆和堆:内存工作的划分

堆作为程序执行的一个层次,负责方法调用处理和数据存储的特​​点是速度非常快,不需要垃圾回收,操作特别简单。每个线程都有自己的堆栈,其中存储局部变量和方法调用详细信息,其生命周期与线程同步。


相比之下,堆是数据存储的主要区域,用于存储对象实例和全局变量。它的生命周期不受线程影响,垃圾收集机制会定期清理不再使用的内存。


接下来我们重点介绍Java虚拟机栈,它是每个线程的核心组件:


Java虚拟机栈:中央程序执行指令

每个线程都有自己独立的堆栈,存放方法调用的堆栈帧。这些堆栈帧在方法执行期间创建和销毁。栈帧包含局部变量表和操作数栈,前者用于方法执行过程中临时存储参数和局部变量,后者是计算和存中间结果的主要区域。


局部变量表中的索引(Solt)根据变量类型(例如基类型和引用类型)分配空间。例如int和double各占用两个Solt,参数和局部变量的数量直接影响栈帧大小。


需要注意的是,Java中的符号引用和动态链接机制为方法调用提供了灵活性。静态链接是在编译时确定的,而动态链接是在运行时根据方法调用的实际上下文发生的。


链接和动态绑定机制

Java支持两种绑定机制:早期绑定(在编译时指定)和晚期绑定(在运行时指定)。通过虚方法表和接口表,Java支持封装、继承和多态性。方法的虚函数特性(非虚方法的最终修饰)提供了动态链接的可能性。


Java7中引入的Invokedynamic进一步扩展了方法调用并支持动态类型语言,为编译器提供了更大的灵活性。


类型检查是区分静态类型语言和动态类型语言的重要标志。


方法重写和异常处理

方法重写取决于运行时类型,Java使用虚拟方法表来确定调用哪个具体实现。如果直接访问的简单名称权限允许,则返回直接方法引用,否则,将按照类的继承链进行搜索,直到找到合适的方法或引发异常。方法调用完成后,涉及到清除局部变量、恢复操作数栈、设置PC寄存器的值。正常退出和异常退出处理也不同。


二、什么是Java虚拟机?它的作用是什么?

Java虚拟机是一种抽象计算机,无需修改即可在多种平台上运行。

Java虚拟机是通过在真实计算机上模拟各种计算机功能来实现的。Java虚拟机有自己完整的硬件架构,如处理器、堆栈、寄存器等。并且还有相应的引导系统。

Java虚拟机保存了与特定操作系统平台相关的信息,因此Java程序只需生成在Java虚拟机上运行的目标代码,无需修改即可在多个平台上运行。

扩展信息:

Java虚拟机支持大约248字节的代码。每个字节码执行基本的CPU操作,例如将整数添加到寄存器、传递子例程等。Java脚本是相当于Java程序的汇编语言。

Java脚本中的命令包含一个单字节运算符,用于指定要执行的操作,并且没有或多个操作数提供操作所需的参数或数据。许多指令没有操作数,仅由一个字节运算符组成。

参考来源:—java虚拟机