面试题答案
一键面试存储内容
- 堆内存:主要存储对象实例(包括对象的成员变量)。例如,创建一个
new Person()
,Person
对象以及其所有成员变量的值都会存储在堆内存中。 - 栈内存:存储局部变量(方法内定义的变量)、方法参数和方法的返回值等。比如在一个方法中定义
int num = 10;
,num
这个局部变量就存放在栈内存中。
生命周期
- 堆内存:对象在堆内存中的生命周期取决于是否有引用指向它。当没有任何引用指向该对象时,在垃圾回收机制运行时,这个对象所占用的堆内存空间就可能被回收。例如,
Person p = new Person(); p = null;
当p
被赋值为null
后,new Person()
创建的对象就可能在未来的某个时间被垃圾回收。 - 栈内存:栈内存随着方法的调用而分配,随着方法的结束而释放。当一个方法被调用时,会在栈中为该方法分配一块栈帧空间,方法执行完毕后,栈帧就从栈中弹出,其所占用的栈内存空间被释放。比如
void method() { int a = 10; }
方法执行完,a
占用的栈内存空间就会被释放。
分配方式
- 堆内存:堆内存的分配是动态的,由
new
关键字或者反射机制等在运行时分配。例如Object obj = new Object();
就在堆内存中为Object
对象分配空间。 - 栈内存:栈内存的分配是自动的,在方法调用时,系统自动为方法内的局部变量等在栈中分配内存空间。比如方法执行开始,局部变量就会在栈中被分配内存。