“栈”——存储方法及其中的局部变量
程序由数据和方法组成,而它们都可以用地址指代。栈便是存储这些地址的地方。
- 栈中的内存是以方法为单位进行划分的,方法调用结束后,内存回收。
- 我们在栈中调用某个方法,首先先开辟一块栈内存区,内存区的开头存储的是被调用方法地址,其他内存空间用于存储方法中的局部变量地址。然后
cpu
通过方法的地址,到方法区查找并执行对应代码。遇到变量,则存储在之前的栈内存中;遇到方法,则在栈中开辟新的内存空间。 - 方法之间的调用是以“栈”的形式体现的,即“被调用”的方法,后入栈,先出栈。
“堆”——存储New出来的对象
由JVM
的垃圾回收机制进行管理,空闲时回收
“方法区”——存储方法代码
在java中,方法区一般存储着class文件,而方法则包含在相应的class中
举个栗子
“堆”和“栈”的例子
1 | int[] arr = new int[3]; |
如上,我们声明并初始化了一个整型数组。其中整型数组 arr
就是“栈”变量,而 new int[3]
属于堆变量。
“方法区”的例子
如下图所示,当jvm
调用方法时,无论是main
方法还是change
方法,其都是通过在方法区查找对应class文件中的对应方法,然后将对应代码加载到栈内存,最后由cpu
去执行。