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

atomic.Value 中存储的数据是否会被 GC

package mainimport ("fmt""log""math/rand""reflect""sort""sync""sync/atomic""time"
)// 模拟 DAO 层的数据结构
type Config struct {ID     int64Name   stringActive boolSort   int
}// 声明接口供 mock 和注入使用
type IConfigDao interface {GetAll() ([]*Config, error)
}// 内存模拟实现
type ConfigDao struct{}func (d *ConfigDao) GetAll() ([]*Config, error) {// 模拟从数据库获取数据return []*Config{{ID: 1, Name: "Config-A", Active: true, Sort: 10},{ID: 2, Name: "Config-B", Active: false, Sort: 5},{ID: 3, Name: "Config-C", Active: true, Sort: 15},}, nil
}// 缓存池结构体
type ConfigPool struct {wg    sync.WaitGroupstopC chan boolconfigDao IConfigDao// 缓存字段configsMap atomic.Value // map[int64]*Config
}// 启动定时刷新
const ReloadInterval = 5 * time.Secondfunc (p *ConfigPool) Start() {p.stopC = make(chan bool)_ = p.loadConfigs()p.autoReload()
}func (p *ConfigPool) Close() {if p.stopC != nil {close(p.stopC)}p.wg.Wait()
}func (p *ConfigPool) loadConfigs() error {rows, err := p.configDao.GetAll()if err != nil || len(rows) == 0 {return err}m := make(map[int64]*Config, len(rows))for _, row := range rows {m[row.ID] = row}p.configsMap.Store(m)log.Println("【loadConfigs】Loaded configs:", len(rows))return nil
}func (p *ConfigPool) autoReload() {p.wg.Add(1)go func() {defer p.wg.Done()random := rand.Intn(10)ticker := time.Tick(ReloadInterval + time.Duration(random)*time.Second)for {select {case <-ticker:_ = p.loadConfigs()case <-p.stopC:log.Println("【autoReload】Stopped")return}}}()
}// 获取单个配置
func (p *ConfigPool) GetConfigByID(id int64) *Config {load := p.configsMap.Load()if load == nil {return nil}configs := load.(map[int64]*Config)return configs[id]
}// 分页查询
func (p *ConfigPool) GetConfigsByPage(page, size int) ([]*Config, int) {load := p.configsMap.Load()if load == nil {return nil, 0}configsMap := load.(map[int64]*Config)// 转为 slice 排序后分页keys := make([]int64, 0, len(configsMap))for k := range configsMap {keys = append(keys, k)}sort.Slice(keys, func(i, j int) bool {return keys[i] < keys[j]})var sorted []*Configfor _, k := range keys {sorted = append(sorted, configsMap[k])}// 按 Sort 字段排序sort.Slice(sorted, func(i, j int) bool {return sorted[i].Sort < sorted[j].Sort})start := (page - 1) * sizeend := start + sizeif start >= len(sorted) {return nil, len(sorted)}if end > len(sorted) {end = len(sorted)}return sorted[start:end], len(sorted)
}// ================== Main 函数测试 ==================func main() {// 初始化 poolpool := &ConfigPool{configDao: &ConfigDao{},stopC:     make(chan bool),}pool.Start()defer pool.Close()// 等待加载完成time.Sleep(1 * time.Second)// 测试 GetConfigByIDfmt.Printf("GetConfigByID(1): %+v\n", pool.GetConfigByID(1))// 测试分页查询if list, total := pool.GetConfigsByPage(1, 2); list != nil {fmt.Printf("GetConfigsByPage(1, 2): total=%d\n", total)for _, c := range list {fmt.Printf(" - ID:%d Name:%s Sort:%d\n", c.ID, c.Name, c.Sort)}}// 持续运行观察 reload 日志time.Sleep(30 * time.Second)
}

demo中的atomic.Value 中存储的数据是否会被 GC

如果 atomic.Value 本身没有被释放(即它所在的结构体或变量仍然可达),那么它内部通过 Store() 存储的数据就不会被 GC 回收。

总结一句话:
只要 atomic.Value 所在的对象还“活着”,它内部存储的数据就不会被 GC。
在你的 demo 中,ConfigPool 是长期运行的缓存池,因此 configsMap 中存储的数据在整个程序生命周期内都不会被回收,除非你主动设置为 nil 或者让整个 ConfigPool 实例失效。
如果你希望减少内存占用,可以考虑定期清理不再使用的 key 或使用弱引用结构(如 sync.Map + atomic.Value 组合优化)。

http://www.xdnf.cn/news/9201.html

相关文章:

  • vue展示修改前后对比,并显示修改标注diff
  • 四足机器人环境监测系统相关问题
  • Mac 每日磁盘写入量异常高
  • AI如何颠覆财务预测?——用Python打造自动化智能分析系统
  • 基于Java,SpringBoot,Vue,UniAPP宠物洗护医疗喂养预约服务商城小程序管理系统设计
  • SQL Server 简介和与其它数据库对比
  • 联想小新笔记本电脑静电问题导致无法开机/充电的解决方案
  • 远程控制技术全面解析:找到适合你的最佳方案
  • 北京大学肖臻老师《区块链技术与应用》公开课:03-BTC-数据结构
  • 计算机网络的性能指标
  • 网络协议:[0-RTT 认证 ]
  • 在 LangGraph 中集成 Mem0 记忆系统教程
  • 【HarmonyOS5】Stage模型应用程序包结构详解
  • PDF处理控件Aspose.PDF教程:压缩 PDF 文档的完整指南
  • OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()
  • 网络套接字基础使用和概念
  • PaddleNLP 的文本分类项目
  • React--》掌握react组件库设计与架构规划
  • PyTorch 中mm和bmm函数的使用详解
  • SMT贴片制造流程关键环节解析
  • 科技趋势分析系统(BBC)技术全解
  • 通用前端框架项目静态部署到Hugging Face Space的实践指南
  • PHP实战:安全实现文件上传功能教程
  • 封装渐变堆叠柱状图组件附完整代码
  • C语言基础-初识
  • R包安装报错解决案例系列|R包使用及ARM架构解决data.table安装错误问题
  • WPF【11_5】WPF实战-重构与美化(MVVM 实战)
  • 计算机网络学习20250527
  • pycharm终端遇不显示虚拟环境的问题
  • Windows版本的postgres安装插件http