面试题答案
一键面试存储的数据类型
- 堆:主要存储对象实例(包括对象的成员变量)。比如创建一个
User
对象User user = new User();
,user
对象及其内部成员变量的数据就存放在堆中。 - 栈:存储基本数据类型(如
int
、float
、boolean
等)的变量值和对象的引用变量。例如int num = 10;
,num
的值存放在栈中;而对于对象引用User user;
,user
这个引用存放在栈中,它指向堆中的User
对象实例。
生命周期
- 堆:对象的生命周期取决于是否还有引用指向它。当一个对象不再被任何引用指向(即成为垃圾对象)时,它不会马上被销毁,而是等待垃圾回收器在合适的时机回收它所占用的内存空间。比如在方法中创建了一个局部对象,方法执行完后,如果没有其他地方引用该对象,它就会成为垃圾回收的候选对象。
- 栈:栈中变量的生命周期与它们所在的方法或代码块紧密相关。当方法或代码块开始执行时,栈中为相关变量分配内存空间;当方法或代码块执行结束,这些变量所占用的栈空间会被自动释放。例如一个方法中的局部变量,方法执行完毕,该变量就从栈中消失。
内存回收机制
- 堆:采用垃圾回收机制(GC)回收内存。垃圾回收器会定期扫描堆内存,标记那些不再被引用的对象,并在合适的时候回收这些对象占用的内存空间。常见的垃圾回收算法有标记 - 清除算法、标记 - 整理算法、复制算法等。例如在应用程序运行过程中,随着对象的不断创建和废弃,垃圾回收器会在后台适时启动来清理不再使用的对象。
- 栈:不需要专门的垃圾回收机制。栈内存的释放是自动的,随着方法或代码块的结束,栈帧(包含方法中的局部变量等信息)被弹出栈,其所占用的内存空间立即被释放。例如一个简单的方法执行完,方法对应的栈帧被移除,栈中为该方法局部变量分配的空间就被收回。