面试中有遇到几个golang的问题,记录一下
- recover能处理所有的异常吗
根据目前查到的资料和实践, recover能处理程序主动触发的panic和除0以及空指针访问、异常地址访问等错误,因此可以认为是能处理所有异常了。 - golang中常量是怎么实现的
这个问法还是很奇怪的, 从汇编中看是对字符串常量加了一个标号,同时设置为SRODATA,也就是只读,对数字常量直接在代码中作为立即数使用了 - 简单描述下golang的gc算法
golang现行的gc算法是三色标记法,三色指的是在gc过程中会把对象标记给黑,灰,白三色。
三色标记法是对标记-清除算法的优化,目的是减少stop the world的时间。
标记-清除算法:
对象只有黑白两色 - stop the world,即停止所有goroutine
- 从根对象(全局指针和栈上的对象)出发,把所有能直接或间接访问到的对象标记为黑色,其它所有对象标志为白色
- 清除所有白色对象
- start the world
三色标记法:
对象有黑白灰三色
- stop the world
- 将根对象全部标记为灰色
- start the world
- 在goroutine中进行对灰色对象进行遍历, 将灰色对象引用的每个对象标记为灰色,然后将该灰色对象标记为黑色。
- 重复执行4, 直接将所有灰色对象都变成黑色对象。
- stop the world,清除所有白色对象
这里4,5是与用户程序是并发执行的,所以stw的时间被大大缩短了。 不过这样做可能会导致新创建的对象被误清除,因此使用了写屏障技术来解决该问题,大体逻辑是当创建新对象时将新对象置为灰色。
有疑问加站长微信联系(非本文作者)