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

java虚拟机使用教程图解


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

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


堆和堆:内存工作的划分

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


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


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


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

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


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


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


链接和动态绑定机制

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


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


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


方法重写和异常处理

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