Java对象内存管理分为三块
分别为 堆内存 栈 方法区
JVM提供为java程序提供并且管理所需的空间
- 堆
- 专门存储用new关键字创建的对象
Student s = new Student();//new一个对象
对象new Student()创建的对象位于堆内,其成员变量也位于堆中。
- 成员变量的生命周期
s=null;
System.gc();//让垃圾回收器快些回收
对象被创建时存在堆内存活,当不存在任何引用指向该对象(s被指向null)时对象被垃圾回收器生命周期结束。
- 内存泄漏
不再使用的对象没有被垃圾回收器回收;若对象不再用了,及时将引用设置为null
- 栈
- 存放正在调用中方法的所有局部变量
调用该方法时在栈中分配一块区间作为栈帧,栈帧包含所有的局部变量(包含参数)
调用方法结束时,栈帧消失,局部变量也一块消失
public void test(){
Student s = new Student();//new一个对象
Student ss = s;
int num = 5;
}
当test函数被调用时候
对象new Student()存放于堆中。
引用 s存放于栈中。
Student ss = s;引用 ss存放于栈中。 栈中存在两个引用,s(0x1111)与ss(0x1111),两者地址相同所以指向同一个对象。
num变量存放于栈中为当前正在执行的方法分配的栈帧中。
当方法执行完毕
栈中为当前正在执行的方法分配的栈帧消失,栈帧内的局部变量num也一并消失
s = null;
将s指向null后,栈中依然存在两个引用,s(null)与ss(0x1111),两者地址不相同,ss依然指向之前创建的Student对象,而s不指向任何对象。
- 方法区
- 专门用于存放类的信息(方法),程序执行时通过类装载器载入类的信息,经过解析后将其装入方法区。重复使用只装载一次
- 方法区只存放类信息的方法,堆中存放成员变量,每个对象拥有自己的成员变量,共享方法区中类的成员方法。
- 方法只有一份 通过this区分具体的引用