一文秒懂Java类加载机制的过程,不信你试试

294 阅读3分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

今天我们来聊聊关于JVM内存区域中是如何运行和划分的:

因为每天都会运行很多程序,他们不约而同的都运行在JVM(JAVA VIRTUAL MACHINE)虚拟机中, 我们来揭开他的面纱:

本质上:

Java内存区域划为为 方法区, 栈空间,堆空间,以及程序计数器这几个部分组成:

一个类从加载到运行的过程是这样的:

image.png

1. 方法区

  这个方法区域, 一个类经过类加载器之后,会在方法区中,存放当前类的模板class文件

image.png

image.png

方法区域:

注意事项:

方法区又名(method area)静态区 ,存放所有的类Class的对象, 被所有线程所共享

存放static修饰的变量,方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

  方法区域也会存在很多对于静态变量啊,静态方法等一些数据,

2.堆空间:(heap):

     

   堆空间中存储对象,所有new出来的对象都存在堆空间,  

堆管存储,栈管运行,

image.png

3.程序计数器:

image.png

基于JVM中 多个线程执行方法-->方法代码

image.png

因为所有的线程运行方法, 都会创建一个当前线程的虚拟机栈,用来存储方法中的局部变量;

所有,只要是程序运行,就会有虚拟机栈存在,

image.png

image.png

如果有多个递归的方法嵌套, 此时, 这个因为当前虚拟机栈里面的栈帧


image.png

image.png

image.png

面试题:问一个类的加载到消亡会经历怎样的过程?

首先, 当二进制的字节码文件class,经过类加载器,加载到jvm中之后, jvm各个部分就开始分工合作了;

  • (1) 对象class加载到静态区---方法区,存放static修饰的成员变量

  • (2) 开始运行,线程开始创建一个虚拟机栈空间, 用于方法的运行(程序的运行都是靠方法的调用) ,每个方法中的成员变量会创建一个栈帧  写入虚拟机栈中, 栈空间存储数据的交换以及处理,   然后如果需要创建当前类的实例化对象,   经过从方法区,Java的反射机制创建出实例化对象,

  • (3)实例化的对象存储在堆空间中,唯一只存在堆空间的就是class对象, 是普通的实例化对象 

  • (4) 对象调用方法, 栈空间读取当前对象的引用地址,开始进行复杂的计算, 然后方法结束  获取结果,结束,垃圾回收,方法完结

**注意事项: 当前内存区域中, 只存在堆管存储对象,栈管运行方法和存储对象的引用地址,

类加载运行在JVM的细节过程

image.png