16.C#堆内存优化方向及方案

  1. 16.CSharp堆内存优化方向及方案
    1. 16.1 题目
    2. 16.2 深入解析
      1. 具体方案
    3. 16.3 答题示例
    4. 16.4 关键词联想

16.CSharp堆内存优化方向及方案


16.1 题目

C#中堆内存优化的大方向是什么?再说3点具体方案?


16.2 深入解析

总体思路:尽量控制内存占用的大小,减少内存分配和释放的频率。

具体方案

  1. 减少临时对象的分配

    • 临时对象会增加内存分配的频率,从而增加垃圾回收的压力。应尽量复用对象,避免频繁创建和销毁临时对象。
  2. 使用结构体代替小型的类(视场景)

    • 小而短生命周期的数据可用 struct 避免堆分配;注意struct 作局部变量常为栈分配,但作为 类字段、数组元素或装箱时仍可能在堆上,不能一概而论「struct 一定不占堆」。
    • 示例代码:
      struct Point
      {
          public int X;
          public int Y;
      }
      
  3. 使用缓存池(对象池)

    • 缓存池(对象池)技术可以复用对象,避免频繁分配和释放内存。通过维护一个对象池,可以显著减少内存分配和垃圾回收的次数。
    • 示例代码:
      public class ObjectPool<T> where T : new()
      {
          private readonly Stack<T> _objects = new Stack<T>();
      
          public T GetObject()
          {
              if (_objects.Count > 0)
              {
                  return _objects.Pop();
              }
              else
              {
                  return new T();
              }
          }
      
          public void ReturnObject(T obj)
          {
              _objects.Push(obj);
          }
      }
      
  4. 尽量避免频繁分配和释放大对象

    • 大对象的分配和释放会触发较多的垃圾回收,影响程序性能。应尽量复用大对象,避免频繁创建和销毁。
  5. 避免内存泄漏

    • 泄漏会导致占用持续上升:避免静态/事件长期持有无用引用,及时 Dispose/Unload 非托管与 Unity 资源。
    • 示例:
      // 风险:静态列表持续增长,持有大数组引用
      private static List<byte[]> _largeDataList = new List<byte[]>();
      
      public static void AddLargeData()
      {
          _largeDataList.Add(new byte[1024 * 1024]);
      }
      
      // 更稳妥:限定生命周期、用完 Remove/Clear,或不用静态缓存承载大对象
      

16.3 答题示例

在 C# 中,堆内存优化的核心思路是“减少分配、延长复用、及时清理”,具体可以从以下几个方面着手:

  1. 减少临时对象分配:尽量在高频调用(如 Update、循环)中复用已有实例,而不是每次都 new
  2. **使用 struct 代替小型 class**:注意使用场景,减少不必要堆分配;
  3. 对象池(Object Pool):为弹幕、粒子、子弹、网络包等高频创建销毁的对象维护池子,统一获取和归还;
  4. 避免频繁分配大对象:大对象(>85K)进 LOH,不会及时回收,应预分配或重用缓冲区;
  5. 防止内存泄漏:及时取消事件订阅、清理静态集合、释放不再使用的资源,确保对象可被 GC 回收。

16.4 关键词联想

  • 内存分配
  • 垃圾回收 (GC)
  • 大对象堆 (LOH)
  • 值类型 vs 引用类型
  • 对象池
  • 内存泄漏
  • 临时变量
  • 资源释放 (Dispose)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏