golang的几个问题

王小二黑 · · 990 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

面试中有遇到几个golang的问题,记录一下

  1. recover能处理所有的异常吗
    根据目前查到的资料和实践, recover能处理程序主动触发的panic和除0以及空指针访问、异常地址访问等错误,因此可以认为是能处理所有异常了。
  2. golang中常量是怎么实现的
    这个问法还是很奇怪的, 从汇编中看是对字符串常量加了一个标号,同时设置为SRODATA,也就是只读,对数字常量直接在代码中作为立即数使用了
  3. 简单描述下golang的gc算法
    golang现行的gc算法是三色标记法,三色指的是在gc过程中会把对象标记给黑,灰,白三色。
    三色标记法是对标记-清除算法的优化,目的是减少stop the world的时间。
    标记-清除算法:
    对象只有黑白两色
  4. stop the world,即停止所有goroutine
  5. 从根对象(全局指针和栈上的对象)出发,把所有能直接或间接访问到的对象标记为黑色,其它所有对象标志为白色
  6. 清除所有白色对象
  7. start the world

三色标记法:
对象有黑白灰三色

  1. stop the world
  2. 将根对象全部标记为灰色
  3. start the world
  4. 在goroutine中进行对灰色对象进行遍历, 将灰色对象引用的每个对象标记为灰色,然后将该灰色对象标记为黑色。
  5. 重复执行4, 直接将所有灰色对象都变成黑色对象。
  6. stop the world,清除所有白色对象

这里4,5是与用户程序是并发执行的,所以stw的时间被大大缩短了。 不过这样做可能会导致新创建的对象被误清除,因此使用了写屏障技术来解决该问题,大体逻辑是当创建新对象时将新对象置为灰色。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:王小二黑

查看原文:golang的几个问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

990 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传