Go 发布了 Go1.19 Beta1 版本。
内存模型
Go 与 C、C++、Java、JavaScript、Rust、Swift等语言使用的内存模型保持一致。Go只提供顺序一致的原子,而不是在其他语言中发现的任何更宽松的形式。随着内存模型的更新,Go 1.19在包中引入了新的类型sync/atomic,使原子值的使用变得更容易,例如 atomic.Int64 和 atomic.Pointer[T]。
CPU支持
龙芯64位 GOOS=linuxGo 1.19 在 Linux ( , GOARCH=loong64) 上增加了对龙芯 64 位架构 LoongArch 的支持。
RISC-V 该riscv64端口现在支持使用寄存器传递函数参数和结果。基准测试显示 10% 或更多的典型性能改进riscv64。
运行时(Runtime)
运行时现在包括对软内存限制的支持。包括Go堆和运行时管理的所有其他内存,不包括外部内存源,例如二进制文件本身的映射、以其他语言管理的内存以及操作系统代表 Go 程序持有的内存。这个限制可以通过runtime/debug.SetMemoryLimit或等效的GOMEMLIMIT环境变量来管理。该限制与runtime/debug.SetGCPercent一起使用GOGC,即使GOGC=off,允许Go程序始终最大限度地利用其内存限制,在某些情况下提高资源效率。
为了在程序的活动堆大小接近软内存限制时限制 GC 抖动的影响,Go 运行时还尝试将总 GC CPU 利用率限制为 50%,不包括空闲时间,选择使用更多内存而不是阻止应用程序进展。希望此限制仅在特殊情况下发挥作用,并且新的 运行时指标/gc/limiter/last-enabled:gc-cycle会报告最后一次发生的时间。
当应用程序空闲到足以强制执行周期性 GC 周期时,运行时现在在空闲操作系统线程上调度的 GC 工作 goroutine 会更少。
运行时现在将根据 goroutine 的历史平均堆栈使用情况分配初始 goroutine 堆栈。这避免了在平均情况下需要的一些早期堆栈增长和复制,以换取在低于平均水平的 goroutine 上最多浪费 2 倍的空间。
文章评论