安装程序
.NET为分段的每一代堆(0,1,2,LOH)分配内存,以便在启动时获得连续的内存块,并在收集之后尝试满足分配请求。
这个分配给每个堆的内存可能会随着应用程序“升温”而平稳下来,除了第2代和大对象堆以外。 在垃圾收集期间,每个堆(0,1,2)都被扫描和压缩,除了刚刚扫过的大对象堆(LOH)之外。
我理解集合的“扫描”部分意味着GC确定哪些对象不再是根源,并且可用于收集(或定稿),而“紧凑”意味着在堆中仍然活着的地址被重新组织可用的剩余堆有更多可用的连续内存。
无法删除Microsoft.Bcl.Build.Tasks.dll
我怎样才能确保从MysqL数据库拉取的数据在Mssql和SSIS中被识别?
Perfmon,PerfMonitor和PerfView
如何在Windows窗体中暂停backgroundWorker
由于超过了堆中每个段的预算,.NET将分配另一个段来完成分配(如果可能的话)。
问题
我的问题归结为每个堆中的内存会发生什么情况,而不是由应用程序 (提交)使用,但仍保留.NET? 什么时候释放回操作系统? 。
我相信这是一个过程可能会消耗大量内存的情况(虚拟大小非常大,但是私有字节很小),但是在检查其堆时大部分是可用空间 。 另外需要注意的是,堆的总大小也可能相当小 ,并且不考虑进程消耗的内存。
没有阻塞的终结器,所有看起来都很健康的进程 – 它可能已经运行了几个星期,然后触发监视器警报(例如)。
尝试进一步澄清问题,如果您阅读了Tess .NET内存pipe理 – 餐厅类比 ,如果表是堆段,那么餐厅是否会丢失表(例如,免费的堆段)?
编辑
删除了工作组和鸡只的混淆参考
添加了对Tess餐厅类比的参考
以C#.Netforms托pipe进程会禁用某些进程的button
以编程方式更改播放设备xp
如何检测Windowslogin事件?
c ++致命错误c1083项目之前很好,现在呢?
什么是一个好的阴谋库。净?
我的答案是 – 没关系。 操作系统为应用程序(运行.NET运行时)提供虚拟内存 。 这不是“真实”的记忆。 操作系统可以将虚拟内存的每一页放在任何它喜欢的地方 – 在处理器上,在主内存中,在磁盘上。 因此,应用程序可能使用的内存数量超过了系统内存的数量,操作系统会将所需的位复制到磁盘以确保应用程序继续运行(取决于某些寻址和技术限制)。
操作系统管理系统上所有进程的虚拟内存,并确保一个程序不会占用系统上的所有内存而损害其他程序。 当.NET运行时要求系统中的内存在堆中使用,但是不使用它时,这个内存将(如果系统空闲RAM空间不足)移动到磁盘上,因为它没有被访问。
澄清通过电子邮件从苔丝
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。