✍个人博客:Pandaconda-优快云博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
133. goroutine 泄露如何排查?
单个函数:调用 runtime.NumGoroutine 方法来打印执行代码前后 Goroutine 的运行数量,进行前后比较,就能知道有没有泄露了。
生产/测试环境:使用 PProf 实时监测 Goroutine 的数量。
134. Go goroutine 和线程的区别?
Go 的 goroutine 是一种轻量级的协程,与传统的操作系统线程相比,具有以下区别:
1、调度模型
Go 语言中的 goroutine 采用的是 M:N 调度模型,即 M 个 goroutine(协程)映射到 N 个系统线程上,这些线程由 Go 运行时进行调度。而传统的线程则是采用的 1:1 调度模型,即一个线程对应一个系统线程。
2、轻量级
Go 的 goroutine 比传统的线程更加轻量级,创建和销毁 goroutine 的代价比较小,且 goroutine 的初始栈大小只有几 KB,而线程的栈大小通常要大得多。
3、内存占用
由于 goroutine 的内存占用比线程更小,因此在同样的硬件资源下,Go 程序可以运行更多的 goroutine。
4、通信机制
在 Go 中,goroutine 之间的通信使用的是 Channel,Channel 可以避免传统线程中使用锁带来的复杂性和性能损失。
5、错误处理
在传统线程中,如果一个线程抛出异常或崩溃,那么整个进程都会被杀死。而在 Go 中,当一个 goroutine 抛出 panic 时,只有该 goroutine 会被终止,不会影响其他 goroutine 和整个进程。
综上所述,与传统的线程相比,Go 的 goroutine 更加轻量级,占用资源更少,拥有更好的并发性能和更容易处理错误。这也是 Go 语言在并发编程中的优势所在。
135. Go 如何在程序中引入 pprof pakage?
在程序中引入 pprof package:
import _ "net/http/pprof"
程序中开启 HTTP 监听服务:
package main
import (
"net/http"
_ "net/http/pprof"
)
func main() {
for i := 0; i < 100; i++ {
go func() {
select {}
}()
}
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
select {}
}