- 栈操作比堆操作快的原因
- 插入和删除:栈在栈顶插入和删除,效率很高
- 读取:栈是连续分配的,堆是分散的。这样在内存中访问数据的时候,可以利用局部性原理,将相邻的数据一次性的加载到内存中
- 读取:寻址方式不同,栈是直接寻址,堆是间接寻址。
- 栈分配和堆分配的时机
- 堆上:new和make产生的指针和引用类型
- 堆上:变量所需空间太大,一般是超过了几千个字节
- 堆上:变量的生命周期跨越了几个函数调用
- 栈上:函数的小小的局部变量
- 栈回收和堆回收
- 栈回收:函数调用结束。是由编译器自动完成的
- 堆回收:垃圾回收器决定,隔一算时间扫描一次不再引用的变量
- 垃圾回收的三色标记
- 白色:对象初始都是白色,代表着未扫描
- 灰色:对象被扫描到,但是它引用的对象未被扫描
- 本对象和已引用的对象都被扫描了
- 垃圾回收优化
- 新分配的堆内存不会被回收
- 写屏障。指针在操作中告诉gc,此轮不回收
- 辅助GC