理论
方法在执行过程中,在JVM中的内存是如何分配的呢,内存是如何变化的?
1. 方法只定义,不调用,是不会执行的,并且在JVM也不会给该方法分配运行所属的内存空间。只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间。
2. 在JVM内存划分上有这样三块主要的内存空间(还有其它的内存空间):
方法区内存
栈内存
堆内存
3. 关于栈数据结构:
栈: stack,是一种数据结构
数据结构反应的是数据的存储形态。
数据结构是独立的学科,不属于任何编程语言的范畴,只不过在大多数编程语言当中要使用数结构。
作为程序员需要提前精通:数据结构 + 算法[计算机必修]
4. 方法执行的时候代码片段存在哪里?方法执行的时候执行过程的内存在哪里分配?
方法代码片段属于.class文件的一部分,字节码文件在类载(classLoader、类加载器)加载的时候,将其放到了方法区内存当中。所以JVM中的三块主要的内存空间中方法区内存最先有数据。
代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】
5. 方法在调用瞬间,在栈内存中会给该方法分配独立的内存空间,此时发生压栈动作(push),方法执行结束之后,给该方法分配的内存空间全部释放,此时发生弹栈动作(pop)。
压栈: 给该方法分配内存
弹栈: 释放该方法的内存空间
6. 局部变量在方法体中声明,局部变量在运行阶段内存在栈中分配。
局部变量有形参也有在方法体定义的局部变量。
局部变量生命周期最短,因为只要出了这个方法的大括号,那么就意味着这个方法结束了,方法结束了那么就再也没有机会去访问这个内存空间因为内存空间释放掉了,没有了。
JVM执行原理图
栈数据结构
1. 栈帧永远指向栈顶元素。
2. 栈顶元素处于活跃状态,其它元素静止。
3. 术语:
压栈/入栈/push
弹栈/出栈/pop
4. 栈数据结构的特点是:
先进后出
后进先出