golang基础面试题完整.docx





《golang基础面试题完整.docx》由会员分享,可在线阅读,更多相关《golang基础面试题完整.docx(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、golang基础试题启动流程Q.go的init函数是什么时候执的? Q.多个init函数执顺序能保证吗?Q.go init 的执顺序,注意是不按导规则的(这是编译时按件名的顺序执的) Q.init函数能被外部调吗?内存分配外链图转存失败,源站可能有防盗链机制,建议将图保存下来直接上传(img-p22eNrMY-1646530923570) (C:UsersMSIAppDataLocalTemp1646493064752.png)代已未堆栈环命 go内存结构:三个区域:span区512MB(注意:mspan在arena区),bitmap区16GB,arena区512GB 内存管理组件:mcach
2、e锁分配, mcentral, mheapmspan 是 双 向 链 表 tiny分配器,减少内存浪费率,但回收困难,所有对象可回收才能回收 span少1个page(8k),被划分成固定的slot,bitmap表slot是否在使mchache锁分配 ,mcentral,mheap.32kb,从mheap从获取.16且指针,使tiny分配器.mheap 中取Q.内存对齐 A.跟c+的样,8字节对齐Q.go 内存分配,和 tcmalloc 的区别A.借了tcmalloc的思想Q.内存分配的不同法的优缺点(固定分区、动态分区、页式分配) A.Q.copy是操作符还是内置函数A. 内 置 函 数 Q.
3、Go怎么做深拷贝 A.先序列化,再反序列化Q.了解内存泄漏吗?有什么危害? A.占资源,甚程序奔溃 Q.空结构体的处A.1.map 。 value是空结构体,构造集合。2.通道。只传递信号,不传递数据。3.切。不管切多长,都不会占空间。4.仅包含法的结构体。不指针,节约空间。5.最后零字段。final zero field:结构体的最后个属性如果是空结构体,会当成1个字节处理。如果结构体嵌套的全是空结构体,还是0个字节。Q.golang如何确定有没有内存泄露?系统怎么去监控整体的运情况?志是怎么处理的?A.Q.虚拟内存地址Q.char *Ptr=0; *Ptr=a 说明下内存分配流程A. 报
4、错 。 Q.什么是内存逃逸,在什么情况下发,原理是什么?A.法内变量是值,返回了变量地址,这个时候会出现内存逃逸 Q.逃逸分析说下?为什么要逃逸分析?如何避免逃逸 A.少指针Q.连接池的好处 A.复,减少资源消耗。Q.byte 和 rune 有 什 么 区 别 A.rune是int32,占的字节数不样Q.malloc怎么减少内存碎 (?啥玩意不会) A.极分配器,会内存合并Q.Go语内存分配,什么分配在堆上,什么分配在栈上。【我顺便提了下内存逃逸,应该算加分了嘻嘻】 A.局部变量,参,全局变量存在栈上。引类型存堆上。Q.数据在内存中的存储形式A.Q.能说说栈在实际中的应吗A.Q.什么编译器A.
5、Q.go的启动过程A.Q.go怎么实现封装继承多态A.struct模拟类。组合实现继承。接实现多态。Q. 知道浮点数在机器上怎么存储的A.符号位,阶码,尾数Q.go语的时候垃圾回收,写代码的时候如何减少对象分配 A.Q.简单介绍下go的内存分配机制? 有mcentral为啥要mcache?答了mcentral是服务所有系统线程,mcache为系统线程独享,mcache缺少span时去mcentral-mheap中取Q.当写个程序申请内存时,会做哪些操作? A.中断,页置换,堆,栈等。 Q.什么法可以限制从堆分配内存的内存范围? A.Q.说下 string 和 byte 的效转换Q.Go的数据结
6、构的零值是什么 A.引类型是nil,其他是0,0.0,等等垃圾回收1.3 版本是标记清除算法,stw时间过长STW,stop the world;让程序暂停,程序出现卡顿 (重要问题)。标记需要扫描整个heap清除数据会产heap碎gcStart三标记法,“强-弱” 三不变式、插屏障、删除屏障、混合写屏障、STW 有两个问题, 在三标记法中,是不希望被发的条件1: 个对象被对象引(被挂在下)条件2: 灰对象与它之间的可达关系的对象遭到破坏(灰同时丢了该) 当以上两个条件同时满时, 就会出现对象丢失现象!插写屏障:A引C,AC,会把C加写屏障buf,最终flush到扫描队列,stw 不:结束时需
7、要stw重新扫描栈,约需要10100ms删除屏障:具体操作: 被删除的对象,如果为灰或者,那么被标记为灰。回收精度低。满: 弱三不变式. (保护灰对象到对象的路径不会断)插写屏障和删除写屏障的短板:插写屏障:结束时需要STW来重新扫描栈,标记栈上引的对象的存活;删除写屏障:回收精度低,GC开始时STW扫描堆栈来记录初始快照,这个过程会保护开始时刻的所有存活对象。混合写屏障:前提条件栈引的对象都是,后来添加的依然是。span有gcmarkBits,0,1灰或三标记:通过mspan查看是否被引灰:对象已被标记,但这个对象包含的对象未标记:对象已被标记,且这个对象包含的对象也已标记,gcmarkBi
8、ts对应的位为1(该对象不会在本次GC中被清理):对象未被标记,gcmarkBits对应的位为0(该对象将会在本次GC中被清理)例如,当前内存中有AF共6个对象,根对象a,b本为栈上分配的局部变量,根对象a、b分别引了对象A、B, B对象引了对象D,则GC开始前各对象的状态如下图所:初始状态下所有对象都是的。接着开始扫描根对象a、b; 由于根对象引了对象A、B,那么A、B变为灰对象,接下来就开始分析灰对象,分析A时,A没有引其他 对象很快就转,B引了D,则B转的同时还需要将D转为灰,进接下来的分析。灰对象只有D,由于D没有引其他对象,所以D转。标记过程结束 最终,的对象会被保留下来,对象会被回
9、收掉。root对象:栈,全局对象等Q.gc触发时机 A.分配内存时,达到GOGC例后台触发-sysmon检测 动 触 发 -runtime.GC() Q.Golang 的 GC 触发时机是什么A.阈值触发;主动触发;两分钟定时触发; Q.执时为啥需要STW?A.漏标,多标 Q.如何解决漏标?A.满三不变性 Q.如何满三不变性? A.屏障技术。 Q.哪记录了对象的三标记状态? A.Q.标记时,拿到个指针,怎么知道它是哪个对象?也许是某个对象的内部指针?这个对象的内存哪些地代表了它引的对象呢? A.Q.gc怎么帮我们回收对象A.三标记Q.go的gc会不会漏掉对象或者回收还在的对象? A.不会回收还
10、在的对象,如果有这个问题,早就歇菜了。 当前gc漏掉是有,但在下次gc的时候就不会漏掉。 Q.gc会不会太慢,跟不上内存分配的速度? Q.gc会不会暂停我们的应?暂停多久?影不影响我的请求?A.STW会暂停,肯定有影响。不过最新的垃圾回收机制将STW时间降低到了极致。Q.如果a=5, b=a , c = &a ,gc启动后,a,b,c是什么颜的?为什么?A.Q.go 的 GC 和 Python 的 GC A.go是可达性分析,Python是引标记。 Q.go语的时候垃圾回收,写代码的时候如何减少对象分配 A.结构体内部字段,考虑内存对齐。其他情况不清楚。Q.string 和 byte 数 组
11、有 什 么 区 别 ? A.byte数组可修改,string不可修改。底层是样的。Q.STW是哪些阶段发的?rescan-stack是为了什么?了解新版本go对写屏障的改进吗? A.扫描栈会STW。新版本是混合写屏障,不需要重新扫描栈。 Q.两次GC周期重叠会引发什么问题,GC触发机制是什么样的? Q.那如果户在并发CMS期间改了引,写屏障如何保证三不变性? A.插屏障和删除屏障共同保证Q.pprof使A.调度器newprocrunnext 123312 g排队逻辑,g调度逻辑GODEBUG=schedtrace=1000 可执程序MP多,不会多太多,最1万个每个P都有本地运队列,满了放全局运
12、队列本地运队列,不超过256个,全局运队列GM分离,络或者锁切换 PM 分 离 , 系 统 调 阻 塞 或 cgo Q.runtime 包 的 法 Q.go的调度为什么说是轻量的 A.跟线程,是轻量了Q.go调度都发了啥A.gmpQ.go络和锁会不会阻塞线程A.会。Q.什么时候阻塞线程A.休眠,加锁等等。Q.协程同步的式 waitgroup和context区别A.waitgroup收集次数,context不收集次数 Q.什么场景不适合协程?那该什么实现并发呢?(epoll) A.Q.创建多个goroutine在多核的情况下是如何分配的A.gmpQ.个main函数内go 开启多个协程,现在个协程
13、panic了,main函数会怎样? 为什么? A.整个程序就奔溃了Q.Golang 的协程间通讯式有哪些? 共享内存和协程通信。Q.说下go协程设计A.由于c实现过协程,所以答的很随意。讲了下函数调约定,栈布局,上下切换,x86寄存器,讲了下gcc的- finstrument-functions。然后讲了下go的调度思路。参考go源码runtime.schedule Q.go实现协程池 A.基本上就是channel实现。Q.golang gmp模型怎么调度的,个goroutine sleep了,操作系统是怎么唤醒的A.信号量、互斥锁、条件变量Q.Go如何调度,假设4核的cpu应该有个线程或者说
14、有个M,那能有个groutinue,groutinue数量的上限是多少? A.理论上限Q.groutinue什么时候会被挂起A. io Q.主线程控制协程的法A.Q.goroutine泄露,或是内存泄漏。A.Q.go 的 goroutine , 如 何 停 个 goroutine? A.(我觉得试官的意思是如何控制goroutine的退出,可以channel和Context) Q.起个线程死循环 cpu会爆吗?A.会。四核线程,8个协程就能让cpu100% Q.如何实现只开100个协程 A. channel 控 制 , 容 量 是 100 Q.golang如何知道或者检测死锁A.pprof Q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- golang 基础 试题 完整

限制150内