面试题答案
一键面试1. 堆(Heap)的作用
- 对象创建:在Java中,当使用
new
关键字创建对象时,对象实例会被分配到堆内存中。堆是JVM用来存储对象实例的区域,它具有较大的内存空间,能满足对象存储需求。例如String str = new String("Hello");
,这里new String("Hello")
所创建的字符串对象就存储在堆中。 - 对象使用:对象在堆中存储其状态信息(成员变量的值等)。其他部分(如栈中的方法调用)通过引用(内存地址)来访问堆中的对象,对其进行操作,例如调用对象的方法修改其成员变量值。
- 对象销毁:堆中的对象不再被任何引用指向时,会被垃圾回收器(GC)标记,在合适时机回收内存。比如一个局部变量所引用的对象,当该局部变量超出作用域,没有其他引用指向该对象,垃圾回收器就可能回收该对象在堆中占用的内存。
2. 栈(Stack)的作用
- 对象创建:栈不直接参与对象实例的创建,但在方法调用创建对象过程中,会为方法调用分配栈帧。例如
void createObject() { String str = new String("World"); }
,在调用createObject
方法时,会在栈中创建栈帧,栈帧包含方法的局部变量表等信息,这里str
作为局部变量会被存储在栈帧的局部变量表中,它存放的是堆中String
对象的引用。 - 对象使用:栈通过存储对象的引用,来实现对堆中对象的访问。在方法执行过程中,根据栈中存储的对象引用找到堆中的对象,进而调用对象方法、访问对象成员变量。例如上述
str
变量,通过其存储的引用在堆中找到String
对象,调用str.length()
方法获取字符串长度。 - 对象销毁:当方法调用结束,栈帧从栈中弹出,栈帧中存储的局部变量(对象引用)随之消失。若堆中对象没有其他引用指向,就可能被垃圾回收。例如
createObject
方法执行完毕,栈帧弹出,str
引用消失,若没有其他地方引用该String
对象,垃圾回收器可能回收该对象。