值、引用类型相关面试题
最近在面试过程中,发现好多工程师对值类型、引用类型还是缺乏有深度的理解。尤其是工作经验在5年以上的工程师,对于变量在内存中的分配细节,还是一知半解。
下面是我随机出的面试题目:请简要阐述以下各变量间的区别。
string a = "Hello";
string b = "";
string c = null;
int i = 0;
关键点有3个:
1.值类型与引用类型的区别
这个点大家都比较清楚,一般值类型分配在栈上面,引用类型分配在堆上面。

但也有特殊情况:
1)如果值类型变量定义在自定义类,作为字段属性,此时值类型变量分配在堆上面。
2)结构体(值类型)中定义引用类型字段,结构体是存储在栈上,其引用变量字段只存储内存地址,指向堆中的引用实例。
2.变量b与c的区别
b、c均属于string引用类型变量,变量均分配在栈上面。区别在于b对应的值“”指向堆上面的一块内存区域;而c对应的值为空,为指向堆。

3.变量c何时被回收,及引入GC相关知识点
1)根据应用程序根指针遍历堆上的每一个引用对象,生成可达对象序列,对使用的对象进行标记(可达对象);
2)针对所有不可达对象进行清除操作,针对普通对象直接回收内存,而实现了析构函数的对象需要单独回收处理;
3)把剩下的对象转移到一个连续的内存。
GC相关内容,后续详细介绍。

浙公网安备 33010602011771号