java内存管理 -- 栈 && 堆 && 方法区

“栈”——存储方法及其中的局部变量

程序由数据和方法组成,而它们都可以用地址指代。栈便是存储这些地址的地方。

  • 栈中的内存是以方法为单位进行划分的,方法调用结束后,内存回收。
  • 我们在栈中调用某个方法,首先先开辟一块栈内存区,内存区的开头存储的是被调用方法地址,其他内存空间用于存储方法中的局部变量地址。然后cpu通过方法的地址,到方法区查找并执行对应代码。遇到变量,则存储在之前的栈内存中;遇到方法,则在栈中开辟新的内存空间。
  • 方法之间的调用是以“栈”的形式体现的,即“被调用”的方法,后入栈,先出栈。

“堆”——存储New出来的对象

JVM的垃圾回收机制进行管理,空闲时回收

“方法区”——存储方法代码

在java中,方法区一般存储着class文件,而方法则包含在相应的class中

举个栗子

“堆”和“栈”的例子

1
int[] arr = new int[3];

如上,我们声明并初始化了一个整型数组。其中整型数组 arr 就是“栈”变量,而 new int[3] 属于堆变量。

“方法区”的例子

如下图所示,当jvm调用方法时,无论是main方法还是change方法,其都是通过在方法区查找对应class文件中的对应方法,然后将对应代码加载到栈内存,最后由cpu去执行。