负责将我们用到的文件,加载到JVM的运行时数据区
主要是存放调用方法时候用到的一些数据;
下面我们用一段简单代码来说明下:
@Data public static class User implements Serializable { Integer id; String name; } public static void main(String[] args) { int a = 1; int b = 2; int c = a + b; User u1 = new User(); u1.setId(1); }
例如,对于上图中的main方法,执行时候,会创建一个main线程,在main线程的虚拟机栈中,会压入一个main方法。之后,对于a,b,c这种普通变量,就会被分配在虚拟机栈中。
例如,执行c=a+b
时候,就会将a,b压入操作数栈,用于执行加法运算;
将符号引用转换为直接引用;我理解的是,将对一些符号的引用,转变为地址指针。
标记这个方法执行完,回到调用它的那个方法的哪行。
结构跟虚拟机栈差不多。主要是存放调用本地方法时候的方法栈;例如,当我们调用Thread的start方法,此时,Java代码会帮我们调用一个标记为native的方法,调用系统的东西去创建线程;
标记当前代码执行到了哪儿。可以先理解为,程序计数器标记了当前字节码(也就是加载到方法区的那个class文件的代码执行到哪儿了)
对象在这块分配,比如上面的main方法中,new的User对象,就会被分配在这里。
常量,静态变量,类信息,比如会把class文件,解析后装载到这个地方。与堆相比,主要放的还是那些不经常变的东西。