it编程 > 编程语言 > Asp.net

C#垃圾回收的优化实践

10人参与 2025-06-11 Asp.net

什么是垃圾回收?

垃圾回收的核心概念 

1. 垃圾回收器的工作原理

2. 分代收集 

 代0(generation 0):

代1(generation 1):

代2(generation 2):

 3. 内存压缩

工作流程 

标记阶段:

标识所有活动的对象(即仍然被引用的对象)。

清除阶段:

收集未标记的对象,并释放它们所占用的内存。

压缩阶段(可选):

移动存活对象,使得内存更加紧凑,通常在代0和代1进行。

使用垃圾回收的最佳实践 

1. 销毁模式和idisposable接口

public class resourceholder : idisposable
{
    private bool disposed = false;

    public void dispose()
    {
        dispose(true);
        gc.suppressfinalize(this);
    }

    protected virtual void dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // 释放托管资源
            }
            // 释放非托管资源
            disposed = true;
        }
    }

    ~resourceholder()
    {
        dispose(false);
    }
}

2. 使用 using 语句

对于实现了 idisposable 接口的对象,使用 using 语句可以确保自动调用 dispose() 方法。

using (var resource = new resourceholder())
{
    // 使用资源
}

3.手动触发 gc(仅在必要时)

虽通常不建议手动调用,但在特定场合(如执行大量内存操作后)可使用 gc.collect() 触发。

gc.collect();
gc.waitforpendingfinalizers();

使用场景

实时应用:

例如游戏或多媒体应用,通过有效管理内存提升响应速度。

服务器端应用:

在web服务器或api服务中,确保内存管理高效以支持大量并发请求。

桌面应用:

对大规模数据处理软件来说,良好的内存管理有助于维持系统稳定性。

实践习题 

编写一个程序,通过创建大量短生命周期对象来观察垃圾回收的工作过程。使用gc.gettotalmemory()方法查看内存使用情况。

using system;

class program
{
    static void main()
    {
        long memorybefore = gc.gettotalmemory(false);
        console.writeline($"memory before allocation: {memorybefore}");

        createobjects(100000);

        gc.collect(); // 手动触发垃圾回收
        gc.waitforpendingfinalizers();

        long memoryafter = gc.gettotalmemory(false);
        console.writeline($"memory after garbage collection: {memoryafter}");
    }

    static void createobjects(int count)
    {
        for (int i = 0; i < count; i++)
        {
            var obj = new object();
        }
    }
}

说明:

这些例子展示了如何实现资源管理和内存监控,帮助您更好地理解.net中的垃圾回收机制

到此这篇关于c#垃圾回收的优化实践的文章就介绍到这了,更多相关c#垃圾回收内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

C#为啥优先使用readonly而非const解读

06-12

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

06-09

C#如何去掉文件夹或文件名非法字符

06-09

C#之List集合去重复对象的实现方法

06-09

C#提取文件时间戳实现实现与性能优化

06-08

Nacos注册中心和配置中心的底层原理全面解读

06-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论