当前位置: 首页 > news >正文

Go的垃圾回收

示例代码

// package main// import (
// 	"fmt"
// 	"runtime" // 只保留需要的包,移除 unused 的 "unsafe"
// )// func main() {
// 	// 1. 定义一个 runtime.MemStats 结构体,用于接收内存统计数据
// 	var m runtime.MemStats// 	// 2. 第一次读取内存状态(调用时传入 &m 指针)
// 	runtime.ReadMemStats(&m)
// 	fmt.Printf("GC 前: 分配的内存 = %d 字节\n", m.Alloc)// 	// 手动触发一次 GC(可选,用于测试)
// 	runtime.GC()// 	// 3. 第二次读取内存状态
// 	runtime.ReadMemStats(&m)
// 	fmt.Printf("GC 后: 分配的内存 = %d 字节\n", m.Alloc)
// }

优化GC的一些注意事项

拿字符串举例子

package mainimport ("fmt""runtime"
)func main() {var m runtime.MemStats // 用于接收内存统计的结构体// 创建一个超长字符串(底层是一个大字节数组)long := make([]byte, 1000000)for i := range long {long[i] = 'a'}s := string(long) // s 引用底层的大字节数组// 方法1:直接切片(共享底层大数组)short := s[len(s)-3:] // short 是 s 的切片,仍引用原大数组fmt.Println("short:", short)// 记录 GC 前的堆内存使用runtime.ReadMemStats(&m)fmt.Println("Memory Before GC:", m.HeapInuse, "bytes")// 触发 GCruntime.GC()// 记录 GC 后的堆内存使用(此时大数组可能未被回收)runtime.ReadMemStats(&m)fmt.Println("Memory After GC:", m.HeapInuse, "bytes")// 方法2:复制切片(创建新的小内存块)shortCopy := string([]byte(short)) // 将 short 转为字节数组再转字符串,创建新内存fmt.Println("shortCopy:", shortCopy)// 再次触发 GCruntime.GC()// 记录复制后的 GC 内存使用(原大数组可被回收)runtime.ReadMemStats(&m)fmt.Println("Memory After Copy + GC:", m.HeapInuse, "bytes")
}

在这里插入图片描述

  • 每个人的情况不一样

关键原理:切片的 “底层数组引用” 对 GC 的影响

  • 方法 1(直接切片 short := s[len(s)-3:])

Go 中的字符串切片本质是 “原字符串的视图”,它会共享底层的大字节数组(即使只取最后 3 个字符)。此时,虽然你只需要 3 个字符,但由于
short 仍引用着原大数组,GC 会认为 “大数组仍在被使用”,因此不会回收这个大数组,导致内存占用居高不下。

  • 方法 2(复制切片 shortCopy := string([]byte(short)))

通过 []byte(short) 将切片转为字节数组(会复制出一个仅包含 3 个字符的新数组),再转为字符串shortCopy。此时,shortCopy 引用的是新的小内存块,原大数组不再被任何变量引用,GC会在下次回收时释放大数组的内存,从而显著降低内存占用。 总结 直接切片会导致“底层大内存块被长期引用而无法回收”,可能造成内存浪费(尤其是处理大字符串 / 切片时)。 若只需使用切片的一小部分,通过 “复制”创建新的小内存块(如 string([]byte(short))),可以让原大内存块被 GC 回收,从而优化内存使用。
在这里插入图片描述

http://www.dtcms.com/a/528272.html

相关文章:

  • 珠海网站管理公司国际公司名字
  • 自动化模型学习器——autoGluon
  • 长沙网站建设招聘外贸做那种网站有哪些
  • 浏览器卡顿内存高?傲游浏览器三核加速,网页加载效率提升60%
  • 研发部门验收流程
  • 贪心算法 with Gemini
  • 掌握 Rust:从内存安全到高性能服务的完整技术图谱
  • [Java]重学Java-Java平台
  • Bash Shell 脚本编程入门详解
  • 打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第七天)
  • 营销型网站建立费用手机端网站开发页
  • 网页模板免费资源搜索引擎排名优化技术
  • 2025年9月电子学会全国青少年软件编程等级考试(Python四级)真题及答案
  • hot 100 技巧题
  • Evaluating Long Context (Reasoning) Ability
  • 乐器基础知识学习
  • 做英语手抄报 什么网站中铁建设集团有限公司分公司
  • Java自动化测试之数据库的操作
  • 算法:并行课程II
  • 信阳住房和城乡建设厅网站企业vi设计说明
  • llama.cpp:Android端测试Qwen2.5-Omni
  • Polar Reverse(中等)
  • A2O MAY首张EP《PAPARAZZI ARRIVE》正式上线 全球宣传全面启动
  • MySQL常用内置函数整理:提高你的查询效率
  • MkFont,一款开源免费的字体设计工具
  • 怎么样才能搜索到自己做的网站jquery做的装修网站
  • 基于Chrome140的TK账号自动化——脚本撰写(二)
  • WPF之Style
  • zabbix实现监控Apache、Nginx、php-fpm应用的实操保姆级流程
  • 69.力扣LeetCode_x的平方根