什么是jvm
JVM是JRE的一部分,即java虚拟机,当我们在安装JDK的时候,就附带安装了JRE,JVM的跨平台特性就和JVM息息相关,java的字节码文件可以在任何具有JVM的电子设备上运行,通过JVM,我们就可以实现对java程序的编译与运行,目前我们需要掌握JVM中的三块主要内存,为后面学习面向对象打下基础。这三块内存分别是:栈内存,方法区和堆内存。,当然,除了这三块还有别的内存,但作为初学者,先掌握这三块即可。
一、栈数据结构
栈:方法在被调用的时候,该方法所需的内存空间,就会在栈内存中进行分配。
压栈:当方法被调用时,在栈空间底部会开辟一个内存空间,此过程被称作压栈
弹栈:位于栈顶部的方法执行完后,释放其内存,此过程被称作弹栈
栈帧:类似于c语言中的指针,永远指向栈顶部的元素。
下面我们通过一张图来理解栈内存(以下图片均来源于B站动力节点杜老师的课程)
从上图我们不难看出:压入栈中的方法先被安置在栈内存的底部,随后的方法依次往上堆叠,并且先进入栈的方法最后被弹栈,后进入的栈的方法最后弹栈。
这里我们解释一下方法递归:比如说求一个数的阶乘的方法 f(int a)
return a*f(a-1)
在栈内存中,f(a)在底部,后面压入的f(a-1)依次上叠,在执行到f(1)时,return1,发生弹栈,从最顶部的f(1)开始依次弹栈,最后弹出f(a),我们就得到了a的阶乘。
二、堆内存
凡是通过new创建出来的对象,都存储在JVM的堆内存之中,new运算符的作用就是在堆内存之中开辟一个空间,这里先不展开,后面面向对象时再详细展开在创建对象时堆内存的变化情况。
三、方法区
JVM自带有一个类加载器,其作用是,将硬盘上的xxx.class字节码文件装载到JVM时,会将字节码文件存放到方法区之中,也就是说方法区之中存放的是你所写的代码片段。(以下图片来源于b站动力节点杜老师的课程之中)
在运行程序时,需要先加载类,所以方法区中会最早有数据。