先看图:五大区域
1.方法区主要存储:类的所有信息(方法,属性等)
static类型的类进入方法区之后会在方法区开辟属于自己的空间,所以静态的可以直接被调用,而非静态的不能直接被调用
不仅是Java语言,其他的语言也是如此
2.栈区:运行时的单位
栈中存的是基本数据类型和堆中对象的引用
开辟一个小栈(开启一个线程)使用完会销毁:复制(拷贝一份)方法区中的方法进行压栈调用,完后出栈,先进后出
主方法(main最先进去),然后依次调用m1方法,进栈出栈,然后轮到m2.依次进行,最后main方法出栈
2.1声明变量原理
声明变量是入栈,遇到{}后面的括号后,出栈(所在的方法在栈中也是一个小栈),跟方法出栈进栈是一样的
3.程序计数器:
线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址(下一次时间片到了之后又可以取指令再次执行)
4.堆区:存储的单位
存放创建的对象(分配了内存地址)、
类是对象的模板,对象是类的实例
方法区中的类作为模板,在堆中造出对象
Person x1=new Person();
句柄=值的地址(堆内存中开辟地址)
5.本地方法栈:本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。