- 我们都知道,我们自己用键盘敲入的代码保存为Java文件,Java文件通过编译器(比如Javac)进行编译,会变为class文件,class文件是怎么执行的呢?就是JVM将其转化为计算机能够“看懂”的机器代码
虚拟机的内存空间,也叫运行时数据区,共分为五个部分:方法区,堆区,程序计数器,虚拟机栈,本地方法栈。其中,方法区和堆区是所有线程共享的,而程序计数器,虚拟机栈和本地方法栈则是每一个线程私有的区域。
公有部分:
- 堆区:Java 堆指的是从 JVM 划分出来的一块区域,这块区域专门用于 Java 实例对象的内存分配,几乎所有实例对象都在会这里进行内存的分配,重要的GC也就是垃圾回收也是发生在这个区域的,Java堆的具体细节,会和GC一起另写一篇文章。
- 方法区:指的是存储 Java 类字节码数据的一块区域,用于存储虚拟机加载的:静态变量+常量+类信息+运行时常量池 (类信息:类的版本、字段、方法、接口、构造函数等描述信息 )
私有部分:
- PC寄存器也叫程序计数器,是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。任意时刻,一条 Java 虚拟机线程只会执行一个方法的代码,PC寄存器的值指向方法区中它的内存地址。线程独有的。作用时:CPU在多个线程切换时可以指示切回的位置
- Java 虚拟机栈,这个栈与线程同时创建,用来存储栈帧,即存储局部变量与一些过程结果的地方。栈帧存储的数据包括:局部变量表、操作数栈。
- 本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。
总结
运行到JVM内存这个地步,一个 我们编写的Java 文件就加载到内存中了,并且 Java 类信息就会存储在我们的方法区中。如果创建对象,那么对象数据就会存放在 Java 堆中。如果调用方法,就会用到 PC 寄存器、Java 虚拟机栈、本地方法栈等结构。接下来就是类加载的过程。