编译好的Java程序需要运行在JVM中
程序,无论是代码还是数据,都需要存储在内存中,JVM为Java提供并管理所需要的内存空间
JVM内存分为“堆”、“栈”以及“方法区”,分别用于存储不同的数据
一、堆
JVM为其内存空间开辟一个称为"堆"的存储空间,这部分空间用于存储new关键字所创建的对象
一个简单的类
public class Cell {
public int row;
public int col;
}
成员变量的生命周期:
访问对象需要依靠引用变量,所谓引用变量举例说明
Cell cell = new Cell(); cell就是Cell类的引用变量
当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围,该对象中的成员变量也将被回收,成员变量的生命周期为从对象在堆中创建开始到对象从堆中回收结束,cell=null,成员变量失效。
二、栈
JVM为其内存空间开辟一个称为“栈”的存储空间,这部分空间用于存储程序运行时在方法中声明的所有局部变量。例如在main方法中
Cell cell = new Cell();
int num = 5;
此时num这个局部变量就会存在栈内存中。
局部变量的生命周期:
一个运行的Java程序从开始到结束会有多次方法的调用,JVM会为其分配一个对应的空间,这个空间叫做栈帧,一个栈帧对应一个正在调用的方法,栈帧中存储了该方法的参数,局部变量等数据,当一个方法调用完成后,其对应的栈帧会被清楚,局部变量会失效。
成员变量和局部变量
1、局部变量,定义在方法中,没有默认值,必须自行设定初始值,方法被调用时,存在栈中,方法调用结束,从栈中清除。
2、成员变量,定义在类中,方法外,有默认初始值,可以不显示初始化,在类被实例化后存在堆中,对象被回收则失效。
三、方法区
方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区,类的各种信息(包括方法)都存在方法区。
方法只有一份
当类的信息被加载到方法区之后,除了类的信息以外,同时类内的方法定义也被加载到方法区;
类在实例化对象时候,多个对象会拥有各自在堆中的空间,但所有的实例对象会公用方法区中存放的方法