笔记:如何优化垃圾回收(GC)的性能

一、目的:如何优化垃圾回收的性能


二、实现

优化垃圾回收(GC)的性能可以显著提高应用程序的响应速度和整体性能。以下是一些常见的优化策略:


1. 减少对象分配


        尽量减少对象的分配和释放,特别是短生命周期的对象。频繁的对象分配和释放会增加GC的负担。

for (int i = 0; i < 1000; i++)
{
    // 尽量重用对象而不是每次都创建新的对象
    var obj = GetReusableObject();
}

2. 使用结构体(Value Types)


        对于小而简单的数据类型,使用结构体而不是类。结构体在栈上分配内存,不会增加GC的负担。

struct Point
{
    public int X;
    public int Y;
}

3. 避免大对象频繁分配


        大对象(大于85,000字节)会被分配到大对象堆(LOH),LOH的回收代价较高。尽量避免频繁分配大对象。


4. 使用对象池


        对象池可以重用对象,减少对象的分配和释放,从而减轻GC的负担。 

 

public class ObjectPool<T> where T : new()
{
    private readonly Stack<T> _objects = new Stack<T>();

    public T GetObject()
    {
        return _objects.Count > 0 ? _objects.Pop() : new T();
    }

    public void ReleaseObject(T obj)
    {
        _objects.Push(obj);
    }
}

5. 减少全局引用


        全局引用会增加对象的存活时间,导致它们被提升到更高的代。尽量减少全局引用,特别是对短生命周期对象的引用。


6. 调整GC设置


        在某些情况下,可以通过调整GC设置来优化性能。例如,可以使用服务器GC模式来提高多线程应用程序的性能。 

<configuration>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

 7. 使用GC.TryStartNoGCRegion


        在某些实时应用程序中,可以使用 GC.TryStartNoGCRegion 方法来暂时禁用GC,以确保在关键代码段中不会发生GC。

if (GC.TryStartNoGCRegion(1024 * 1024))
{
    try
    {
        // 关键代码段
    }
    finally
    {
        GC.EndNoGCRegion();
    }
}

8. 分析和监控


        使用性能分析工具(如Visual Studio Profiler、dotTrace等)来监控GC的行为,找出性能瓶颈并进行优化。


9. 使用弱引用


        对于缓存等场景,可以使用弱引用(WeakReference)来避免对象被不必要地保留。 

WeakReference<MyClass> weakRef = new WeakReference<MyClass>(new MyClass());
if (weakRef.TryGetTarget(out MyClass target))
{
    // 使用target
}

10. 优化数据结构


        选择合适的数据结构,避免不必要的对象分配。例如,使用数组而不是链表,使用 List<T> 而不是 LinkedList<T>。
通过这些优化策略,你可以显著提高应用程序的GC性能,减少内存管理对应用程序性能的影响。 

需要了解的知识点 

GC 类 (System) | Microsoft Learn

工作站和服务器垃圾回收 (GC) - .NET | Microsoft Learn

垃圾回收和性能 - .NET | Microsoft Learn 

Windows 上的大型对象堆 (LOH) - .NET | Microsoft Learn 

WeakReference Class (System) | Microsoft Learn 

WeakReference Class (System) | Microsoft Learn 

LinkedList 

List 

ObjectPool 

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值