首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Go 中的 = 和 := 有什么区别?
Go 中的指针的意义是什么?
Go 多值返回有什么用?
Go 有异常类型吗?
Go 中的 rune 和 byte 有什么区别?
Go 语言中的深拷贝和浅拷贝?
什么叫字面量和组合字面量?
对象选择器自动解引用怎么用?
map 的值不可寻址,那如何修改值的属性?
有类型常量和无类型常量的区别?
为什么传参使用切片而不使用数组?
Go 语言中 hot path 有什么用呢?
引用类型与指针,有什么不同?
Go 是值传递,还是引用传递、指针传递?
Go中哪些是可寻址,哪些是不可寻址的?
slice 扩容后容量及内存如何计算?
goroutine 存在的意义是什么?
说说 Go 中闭包的底层原理?
defer 的变量快照什么情况会失效?
说说你对 Go 里的抢占式调度的理解。
简述一下 Go 栈空间的扩容/缩容过程?
说一下 GMP 模型的原理。
GMP 模型为什么要有 P ?
不分配内存的指针类型能用吗?
如何让在强制转换类型时不发生内存拷贝?
Go 中的 GC 演变是怎样的?
Go 中哪些动作会触发 runtime 调度?
有哪些情况会导致协程泄露?
局部变量分配在栈上还是堆上?
为什么常量、字符串和字典不可寻址?
为什么 slice 元素是可寻址的?
Go 的默认栈大小是多少?最大值多少?
Go 中的分段栈和连续栈的区别?
内存对齐、内存布局是怎么回事?
Go 里是怎么比较相等与否?
所有的 T 类型都有 *T 类型吗?
数组对比切片有哪些优势?
GMP 偷取 G 为什么不需要加锁?
堆引用栈内存是怎么回收的?
当前位置:
首页>>
技术小册>>
GO面试指南
小册名称:GO面试指南
Go 的 GC(垃圾回收)演变经历了几个版本的迭代和优化。下面简要介绍一下 Go 中 GC 的演变历程。 Go 1.0 在 Go 1.0 中,采用的是标记-清除(mark-and-sweep)算法进行垃圾回收。这种算法的主要特点是将内存分为已分配的和未分配的两部分,其中已分配的内存称为“堆”,未分配的内存称为“栈”。垃圾回收器通过标记堆中的存活对象,并清除未标记的对象来回收内存。 下面是一个使用 Go 1.0 版本进行垃圾回收的示例代码: ``` package main func main() { // 分配一个 1MB 的切片 data := make([]byte, 1<<20) // 释放内存 data = nil // 强制进行垃圾回收 runtime.GC() } ``` 在这个示例代码中,我们首先使用 make 函数分配了一个 1MB 大小的切片,然后将其赋值为 nil,即释放了内存。最后,我们使用 runtime.GC() 函数强制进行垃圾回收。 Go 1.5 在 Go 1.5 中,采用了并发标记-清除(concurrent mark-and-sweep)算法进行垃圾回收。这种算法的主要特点是在程序运行期间,垃圾回收器会在程序运行的同时进行标记和清除操作,从而避免了程序暂停的时间。 下面是一个使用 Go 1.5 版本进行垃圾回收的示例代码: ``` package main import "time" func main() { // 分配一个 1MB 的切片 data := make([]byte, 1<<20) // 释放内存 data = nil // 等待 1 秒钟 time.Sleep(time.Second) } ``` 在这个示例代码中,我们首先使用 make 函数分配了一个 1MB 大小的切片,然后将其赋值为 nil,即释放了内存。最后,我们使用 time.Sleep 函数等待了 1 秒钟,这个过程中垃圾回收器会在后台进行并发的标记和清除操作。 Go 1.8 在 Go 1.8 中,采用了并发标记-整理(concurrent mark-and-sweep with compaction)算法进行垃圾回收。这种算法的主要特点是在进行标记和清除操作的同时,还会将存活对象移动到一起,从而使得堆中的内存连续,减少了内存碎片的产生。 下面是一个使用 Go 1.8 版本进行垃圾回收的示例代码: ``` package main import ( "fmt" "runtime" ) func main() { var m runtime.MemStats // 获取垃圾回收器统计信息 runtime.ReadMemStats(&m) fmt.Printf("Alloc = %v MiB\n", m.Alloc/1024/1024) fmt.Printf("TotalAlloc = %v MiB\n", m.TotalAlloc/1024/1024) fmt.Printf("Sys = %v MiB\n", m.Sys/1024/1024) fmt.Printf("NumGC = %v\n", m.NumGC) } ``` 在这个示例代码中,我们首先使用 runtime.MemStats 结构体来存储垃圾回收器的统计信息。 然后,我们使用 runtime.ReadMemStats 函数获取垃圾回收器的统计信息,并输出了分配的内存大小、总分配的内存大小、系统分配的内存大小和垃圾回收次数。
上一篇:
如何让在强制转换类型时不发生内存拷贝?
下一篇:
Go 中哪些动作会触发 runtime 调度?
该分类下的相关小册推荐:
Go开发权威指南(下)
深入解析go语言
Go语言从入门到实战
深入浅出Go语言核心编程(三)
Golang并发编程实战
深入浅出Go语言核心编程(四)
Go开发权威指南(上)
Golang修炼指南
WebRTC音视频开发实战
从零写一个基于go语言的Web框架
深入浅出Go语言核心编程(七)
深入浅出Go语言核心编程(五)