【Golang 面试 - 进阶题】每日 3 题(十五)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

43. Sysm on 有什么作用?

Sysmon 也叫监控线程,变动的周期性检查,好处:

  • 释放闲置超过 5 分钟的 span 物理内存;

  • 如果超过 2 分钟没有垃圾回收,强制执行;

  • 将长时间未处理的 netpoll 添加到全局队列;

  • 30 向长时间运行的 G 任务发出抢占调度(超过 10ms 的 g,会进行 retake);

  • 收回因 syscall 长时间阻塞的 P;

44. 三色 标记原理

原理:

三色标记算法(Tri-color Mark and Sweep Algorithm)是垃圾回收算法中常用的一种,也是 Go 语言中垃圾回收器采用的算法之一。

三色标记算法的基本思路是将内存中的对象分为三种状态:白色(未访问)、灰色(已访问,但还未处理)、黑色(已访问,且已处理),并按照一定的顺序遍历所有对象,标记出所有可达的对象,最终清除不可达的对象。

具体来说,三色标记算法分为以下几个步骤:

  1. 初始时,所有对象都是白色,加入一个 "根集合"(root set),根集合是一组已知可达对象的集合,如全局变量、函数调用栈等。

  2. 将根集合中的所有对象标记为灰色,并加入一个 "灰色集合"(gray set)中。

  3. 从灰色集合中取出一个灰色对象,遍历其引用的所有对象。如果某个对象是白色,将其标记为灰色,并加入灰色集合中;如果某个对象是灰色,不做处理;如果某个对象是黑色,也不做处理。

  4. 将该灰色对象标记为黑色,并从灰色集合中移除。

重复步骤 3 和 4,直到灰色集合为空。

此时所有可达对象都被标记为黑色,所有不可达对象都是白色。将所有白色对象标记为垃圾,并回收其占用的内存空间。

在 Go 语言中,三色标记算法是垃圾回收器采用的一种算法,其中还包括了其他的优化算法,如并发标记(Concurrent Mark)和并发清除(Concurrent Sweep)。Go 的垃圾回收器会在程序运行时自动启动,不需要手动管理内存,大大减少了程序员的工作量。

45. 写屏障

在 Go 语言的垃圾回收机制中,写屏障(Write Barrier)是一种机制,用于保证内存对象在进行垃圾回收过程中的正确性。写屏障是通过在程序运行过程中对写操作进行监测来实现的。如果一个指针变量被修改为指向一个新的内存对象,写屏障会将被修改的指针变量所指向的对象标记为 "灰色" 状态,并将新指向的对象标记为 "黑色" 状态,以确保该对象不被误判为垃圾对象。在垃圾回收过程中,只有标记为 "黑色" 状态的对象才能被视为可达对象,而未被标记或者被标记为 "灰色" 状态的对象则被认为是不可达对象,可以被回收。

在 Go 语言中,写屏障是由垃圾回收器来实现的,Go 编译器会在需要使用写屏障的地方插入相应的代码。具体来说,当一个指针变量被修改为指向一个新的对象时,Go 编译器会在生成的汇编代码中插入一个钩子(Hook)函数,这个钩子函数会在对象头中设置一个标志位,表示该对象需要被扫描,以便在垃圾回收的过程中正确地标记该对象。

需要注意的是,写屏障虽然可以提高垃圾回收的准确性,但也会带来一定的性能开销,因为需要在写操作时对对象进行监测和处理。因此,在 Go 语言中,写屏障只在必要的情况下才会被触发。同时,也可以通过一些手段来减少写屏障的触发次数,如尽可能减少对象的复制和移动,或者将一些对象的内存布局重新调整,以减少垃圾回收时的复杂度。

相关推荐
0白露23 分钟前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.1 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐1 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
想跑步的小弱鸡1 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
Tttian6223 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
杉之3 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch4 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
独好紫罗兰4 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
bobz9654 小时前
k8s 怎么提供虚拟机更好
后端