在JVM内存划分上有三块主要的内存空间(当然除了这三块还有其他的内存空间,这里先只说这三种主要的)分别是
- 方法区内存
- 堆内存
- 栈内存
那么在正常的开发阶段,方法在执行过程中,在JVM中的内存是如何分布的呢,内存是如何变化的?
一.编译流程
首先xx.java文件在通过编译后会生成xx.class的类文件,然后通过classloader类加载器在硬盘中查找到对应的xx.class文件。找到后会把这个类文件放到JVM中去分配内存空间。
二.执行流程
注意:当方法只定义不调用的时候是不会执行的,因为不执行,所以在JVM中也就并不会给它分配“运行所属”的内存空间,只有在调用这个方法时才会动态的给这个方法分配所属的内存空间。
方法代码片段是属于.class字节码文件的一部分,字节码文件(也就是.class类文件)在类加载的时候,将其放在了方法区内存中,所以这也就导致了JVM的三块主要内存空间中,方法区内存最先由数据存放。
方法代码片段虽然在方法区内存中存放的只有一份,但是实际开发过程中它可以被多次重复调用,每一次调用这个方法的时候,都需要给这个方法分配独立的活动场所,即在栈内存中分配所属的内存空间,此时发生的就是压栈/push/进栈。当方法执行结束的时候,就会释放内存,这时候发生的就是弹栈/pop/出栈。
上图可以比较形象的表达。同时也理解了局部变量生命周期短的原因。局部变量是在"方法体"中声明的,刚开始是和字节码文件一起放在方法区内存中,在执行阶段内在栈中分配内存,在方法执行结束后内存又被释放。
栈数据结构存储数据的特点是:
- 先进后出
- 后进先出
所以在运行阶段最先执行的是main方法,最后释放的是main方法