JVM中代码是怎么运行起来的

423 阅读2分钟

1. 类加载流程

    首先,来看一下大体的流程

加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载

这个流程网上很多文章都写了,我这里就不赘述,下面从JVM内存的角度,来看一下启动流程

2. 代码运行与JVM内存模型之间的关系

方法区       

    类加载器加载class文件,那么加载到哪个区域呢?会加载到方法区之中。

附上一篇文章:blog.csdn.net/qq_29310729…

程序计数器       

    当JVM加载类信息到内存之后,实际就会使用自己的字节码执行引擎,去执行我们写的代码编译出来的代码指令,在执行字节码指令的时候,JVM里就需要一个特殊的内存区域了(程序计数器),程序计数器就是用来记录当前执行的字节码指令的位置的,也就是记录目前执行到了哪一条字节码指令。

虚拟机栈

   通常在我们运行的main方法中,会存在局部变量,那JVM必须有一块区域是来保存每个方法内的局部变量等数据的,这个区域就是Java虚拟机栈。每个线程都有自己的Java虚拟机栈,比如这里的main线程就会有自己的一个Java虚拟机栈,用来存放自己执行的那些方法的 局部变量。如果线程执行了一个方法,就会对这个方法调用创建对应的一个栈帧。栈帧里就有这个方法的局部变量表 、操作数栈、动态链接、方法出口等东西。示例如下图


附上一篇文章:blog.csdn.net/qq_29310729…

堆内存

    JVM中的另外一个非常关键的区域,就是Java堆内存,这里就是存放我们在代码中创建的各种对象的,如main方法中 new Object();那么Object对象的实例就会存储的堆内存中,而Object实例在引用就存储在 main方法 对应的栈帧的局部变量表里。


这样就通过程序的运行将JVM中常见得内存结构串联起来了

class文件-->类加载到方法区-->通过程序计数器记录 字节码执行位置-->方法执行时,将局部变量等压栈-->为创建的对象,申请堆内存。