面试题答案
一键面试对象类型
- Java堆:主要存放对象实例以及数组。几乎所有的对象实例和数组都在堆上分配内存。例如,当创建一个
new ArrayList<>()
对象时,该对象就存放在堆中。 - Java栈:存放方法中的局部变量(包括基本数据类型和对象引用变量)。比如在方法内定义的
int num = 10;
,num
这个局部变量就存放在栈中;如果定义Object obj = new Object();
,obj
这个引用变量存放在栈中,而实际的Object
对象存放在堆中。
生命周期
- Java堆:堆内存的生命周期取决于应用程序的运行周期。当应用程序启动时,堆被创建,在应用程序运行过程中,不断有对象在堆上创建和销毁。只有当应用程序结束时,堆内存才会被释放。例如,一个Web应用程序在服务器上运行,只要服务器不停止,堆内存就一直存在,不断有新的HTTP请求处理过程中创建的对象在堆上分配和释放。
- Java栈:栈的生命周期与方法的调用和返回紧密相关。当一个方法被调用时,一个新的栈帧会被压入栈中,该栈帧包含了该方法的局部变量等信息。当方法执行完毕返回时,对应的栈帧从栈中弹出,栈帧中的局部变量等数据也随之被释放。例如,在一个递归方法调用中,每次递归调用都会在栈中压入一个新的栈帧,当递归结束返回时,栈帧依次弹出。
内存回收机制
- Java堆:采用垃圾回收(GC)机制来回收不再使用的对象所占用的内存。垃圾回收器会定期扫描堆内存,识别出那些不再被任何引用所指向的对象(即垃圾对象),然后回收这些对象占用的内存空间。常见的垃圾回收算法有标记-清除算法、标记-整理算法、复制算法等。例如,当一个对象的引用被置为
null
,并且没有其他引用指向该对象时,在下一次垃圾回收过程中,该对象可能就会被回收。 - Java栈:当方法执行完毕,对应的栈帧从栈中弹出,栈帧所占用的内存空间会自动释放,不需要垃圾回收机制参与。例如,方法
test()
执行完毕返回时,test()
方法对应的栈帧所占用的内存会立即被释放,局部变量也随之消失。