Go 内存和分配管理

Go memory and allocation management

提问人:t.ry 提问时间:7/5/2023 最后编辑:t.ry 更新时间:7/5/2023 访问量:59

问:

  1. 我正在从从Entitybufio.Scanner

    type Entity struct {
      <primitives_fields>
      <enum_fields>
    }
    

    进入他们的指针的一部分

    var entities []*Entity
    
    for scanner.Scan() {
      entity := &Entity{
        <serialize_strings>
      }
    
      entities = append(entities, entity)
    }
    
  2. 我需要将此切片传递到特定的数据结构中entities

    type Datastructure struct {
       items []*Item
       <auxiliary_fields>
    }
    

    生成和存储对象数量:len(entities)Item

    type Item struct {
      entity *Entity
      <auxiliary_fields>
    }
    

    用指针指向它们各自的:Entity

    func (ds *Datastructure) Generate(entities []*Entity) {
      ds.items = make([]*Item, len(entities))
    
      for idx, entity := range entities {
        ds.items[idx] = &Item{
          entity,
          ...
        }
      }
    }
    

    以与另一个容器数据集进行匹配。Other

    • 实体在步骤 1 中切片。既不使用,也不在代码中进一步显式引用,将其传递给数据结构。
  3. 数据结构返回:Matches

    type Match struct {
      entity *Entity
      other *Other
    }
    

    通过一个渠道,其中大约 30% 的将与其中一个 .itemsOther

    • 步骤 2 中的数据结构。既不使用,也不在匹配完成后在代码中进一步显式引用。
  4. 这些容器累积到其指针的切片中:Match

    var matches []*Match
    

    并用于进一步的繁重计算。


这是一项内存中服务,我想了解在整个管道中保留对已分析类型及其指针的引用的位置和原因。Entity

理想情况下,我只想将那些在切片内容器中引用的对象保存在内存中(即只有最初解析的对象的 30%),并取消分配/释放未使用/未匹配的 70% 对象占用的内存。EntityMatchmatchesEntity

例如,如果我在完成它们时同时对 和 切片进行切片,从而删除对未使用的 70% 的任何进一步引用,它们实际上会被垃圾收集,并且它们的内存会被取消分配/释放吗?nilentitiesitemsentities

Go 指针 内存 切片

评论

0赞 t.ry 7/5/2023
@CharlieTumahai补充了澄清;它们是从 A 返回的字符串序列化的,并包含原始数据类型和枚举。bufio.Scanner
1赞 JimB 7/5/2023
任何无法访问的值最终都将被垃圾回收。这是您需要知道的唯一规则。如果切片包含许多不再需要的值,则从切片中删除它们或删除对该切片的引用将允许对它们进行垃圾回收。无论这些是否有任何区别,都需要您使用真实数据对代码进行基准测试 - 运行时在 99% 的时间内完全按照要求执行,无需额外担心。
0赞 t.ry 7/5/2023
@JimB 很公平。非常欣赏简单性,这是一条规则。但是,就像一个构造的例子:一个不再被引用的对象,但有一个指向仍然被引用的对象的指针字段,是无法访问的吗?不是直接问题的一部分,而是我希望在这里直接或间接了解的潜在陷阱。
1赞 JimB 7/5/2023
不能向后跟踪引用,因此对活动对象的引用不会阻止收集引用。将可访问性视为全局范围的有向图,如果您无法从有效代码中获取对象,则无法访问该对象。
0赞 t.ry 7/6/2023
@JimB再次感谢,该图形引用是有道理的。我指的是一般的陷阱,但你的评论现在都足以解决我的问题 - 如果你愿意写一个答案,很乐意接受这个答案!

答: 暂无答案