Java程序执行流程及对应的jvm内存结构

大致流程:

首先xx.java文件–编译—>.class文件–加载–>方法区–解释运行.class文件
详细执行流程需结合视频看:
链接: https://pan.baidu.com/s/14eFyuyGHG7VevFqrqvx4dw 提取码: 45iy

jvm运行区内存结构详解:

运行程序时候为程序简单理解为分配三个区域:
栈(栈帧:每个方法对应一个栈帧)
堆(实例对象)
方法区(.class 类信息)

  1. JVM找到包含main方法的类(入口类),然后将该类加载到方法区中。 此时方法区包含该类的成员变量,成员方法(包括main方法)。
  2. 执行main方法,此时在栈开辟一片区域用于main方法的执行。进入main方法里面,第一句是声明一个对象引用变量,此时要用到一个新的类,将该类加载到方法区中,同样的类Phone在方法区的内容和之前类是一样的(类的成员变量,类的成员方法)。
  3. 接着运行到new语句,执行该语句需要在堆中开辟一片区域,用于对象的存储。对象的创建根据类的声明来的,由于类可以看成是成员变量和成员方法的集合,所以堆中的对象也开辟了相应的空间用于存储成员变量和成员方法,不同的是,成员方法是指向类型,即指向方法区该类的成员函数的地址(由于使用相同类创建的对象在调用成员方法的时候都是调用相同的方法,所以没有必要为每一个对象分配方法空间)。
  4. 接着,程序运行到one.brand语句,将该语句从方法区加载到栈中,由于one是对对象的引用(地址),所以根据该引用找到了刚才在堆中分配的对象,然后访问该对象的成员变量
  5. 接着程序运行到one.call();由于函数的执行需要在栈中进行,所以在栈中开辟一片新区域,并且将根据one找到堆中的对象,刚才提到堆中的对象里的成员函数实际是指向方法区的指针,所以执行的call()是从方法区中加载。将call()方法加载到新开辟的栈区域后程序流程跳转到该栈区域并且执行程序。当call()执行完后,分配的空间被回收。程序流程跳转到main方法中刚才离开的地方,也就是one.call()语句后并继续执行。
  6. 同理,当main方法指向完后,分配的栈区域被回收。程序结束。

猜你喜欢

转载自blog.csdn.net/peanutwzk/article/details/104425815