C#的垃圾回收,时机、大小 如何确定?能手动配置吗?

CCDDzclxy 2019-09-03 09:34:23
RT
刚换工作,转来C#不久,做了个程序,持续的在分析数据。
任务管理器里 看到 程序在内存涨到300多M的内存的时候,内存会下降到200多M,然后再涨到300多M后 再降到200多M,周而复始...

上司(不是专业做程序的,多少知道点东西吧),问我 内存使用能不能降降。他问我 为什么 涨100多M的时候 会回收,为什么回收了 100多M而不是200多M。
我一下子蒙了,就只说了 动态分配内存 回收得看GC 具体无法确定回收的时间和大小 之类的...
他说了一些 要对内存有足够的把握,不能任由GC去搞 之类的话...


于是来问问大家:GC回收内存的 时机 和 大小 是怎么确定的?能不能自己配置?

任何讲解、资料、文章、链接 都欢迎,先谢谢大家了 !!











...全文
454 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
江湖评谈 2020-12-31
  • 打赏
  • 举报
回复
回收时机不可以自己确定,它是自己触发的, 触发条件为当分配量超过阈值,物理内存不够,分配对象找不到可用空间,以及调用gc.collection 四个条件其中一个就会触发垃圾回收 至于大小,为一下结构体,初始化可改变大小 struct static_data { size_t min_size;//阈值下限 size_t max_size;//阈值上线 size_t fragmentation_limit;// float fragmentation_burden_limit; float limit;//阈值增长系数下限 float max_limit;//阈值增长洗漱下限 size_t time_clock; // time after which to collect generation, in performance counts (see QueryPerformanceCounter) size_t gc_clock; // nubmer of gcs after which to collect generation };
高大王 2020-12-30
  • 打赏
  • 举报
回复
手动用析构函数进行回收,释放
  • 打赏
  • 举报
回复
有那时间还不如想想怎么提升自身软件的新能
sidneythomas 2020-12-29
  • 打赏
  • 举报
回复
https://docs.microsoft.com/zh-cn/dotnet/core/run-time-config/garbage-collector#heap-limit-percent 设置限制内存百分比。
极客诗人 2019-09-03
  • 打赏
  • 举报
回复
gc不是自己就处理了吗。。 如果你要就自己手动释放呗
  • 打赏
  • 举报
回复
狗拿耗子
stherix 2019-09-03
  • 打赏
  • 举报
回复
可以调用GC.Collect()强制回收 不过绝大部分情况,没必要手动这么做 300M内存占用不是什么大不了的
jy251 2019-09-03
  • 打赏
  • 举报
回复
C#一般是自动清收,你需要做的就是把你使用的变量清空,系统会自动处理的,函数内的局部变量就不用操心了,出了函数就不用管了
CCDDzclxy 2019-09-03
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神 的回复:
[quote=引用 2 楼 CCDDzclxy 的回复:] [quote=引用 1 楼 正怒月神 的回复:] 那你手动 Dispose或者析构函数。
主要是 这个 申请释放内存 比较频繁,我个人认为,频繁的申请释放内存 又要弄个内存池了,还不如直接 让GC帮我管理比较方便......[/quote] 本来GC的出现, 就是为了让程序员不用关心内存的释放问题。。。[/quote] 本来就是啊,哎 我等底层员工 伺候主子不易啊
lich2005 2019-09-03
  • 打赏
  • 举报
回复
垃圾回收有自己的判断机制在里面,想自己手动去配置,是不太现实的。
给你推荐一本书先看看吧。
《CLR via C#(第4版)》 第21章 托管堆和垃圾回收 有很详细的描述。
正怒月神 2019-09-03
  • 打赏
  • 举报
回复
引用 2 楼 CCDDzclxy 的回复:
[quote=引用 1 楼 正怒月神 的回复:] 那你手动 Dispose或者析构函数。
主要是 这个 申请释放内存 比较频繁,我个人认为,频繁的申请释放内存 又要弄个内存池了,还不如直接 让GC帮我管理比较方便......[/quote] 本来GC的出现, 就是为了让程序员不用关心内存的释放问题。。。
by_封爱 版主 2019-09-03
  • 打赏
  • 举报
回复
没啥用,垃圾回收机制不是那么浅显使用代码就好使的. 你可以这样试验. 一个集合变量一直add 到几万几十万. 然后你在给他赋值null或者clear 你看内存有变化吗. 或者你手动GC,看看效果就知道了.
assky124 2019-09-03
  • 打赏
  • 举报
回复
你要对内存有足够的掌控,用C++啊,都自己控制。 或者开启一个线程,监听进程使用情况,超过一个阀值比如250M,强制GC.Conlect()
CCDDzclxy 2019-09-03
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神 的回复:
那你手动 Dispose或者析构函数。
主要是 这个 申请释放内存 比较频繁,我个人认为,频繁的申请释放内存 又要弄个内存池了,还不如直接 让GC帮我管理比较方便......
正怒月神 2019-09-03
  • 打赏
  • 举报
回复
那你手动 Dispose或者析构函数。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧