golang学习笔记(内存模型和分配机制)
package main
import (
"fmt"
"runtime"
)
func main() {
// 设置Go程的栈大小为2MB
const stackSize = 2 * 1024 * 1024
runtime.StackSize = stackSize
// 打印Go程的默认栈大小
fmt.Printf("默认栈大小: %d KB\n", runtime.DefaultStackSize/1024)
// 创建并启动一个Go程
go func() {
var i *int
// 尝试分配16MB内存,足够使栈溢出
defer func() {
if r := recover(); r != nil {
fmt.Println("Go程捕获到栈溢出错误:", r)
}
}()
_ = make([]byte, 16*1024*1024)
}()
// 阻塞主Go程,以保持程序运行
select {}
}
这段代码设置了一个Go程的栈大小为2MB,并创建了另一个Go程来尝试分配16MB内存。如果栈大小不足以容纳这么多数据,Go运行时会尝试动态增加栈的大小,如果无法扩展则会触发栈溢出,通过recover
函数可以捕获并处理这种错误。
评论已关闭